プロジェクト単位で当該期間の工数を出力する
概要
TimeTracker NXのダッシュボードでモニタリングできる工数やワークアイテム件数のデータを、Web APIを用いることで手軽に再利用することができます。報告資料にデータを取り込んだり、自社の業務システムで統合管理をしたりと、多彩な用途が実現できます。
利用場面
- 集計対象期間に稼働しているプロジェクトの工数を取得する
使用するAPI
以下のAPIを使用します。
- 工数分析データの取得
サンプルスクリプト
//======================================================================
// 工数分析のデータを出力する
//======================================================================
//======================================================================
// 外部ファイル(ライブラリ、他ファイル)のインクルード
//======================================================================
const https = require('https'); // HTTPS通信を利用する場合に設定する
const http = require('http'); // HTTP通信を利用する場合に設定する
const axios = require('axios');
const fs = require('fs');
const iconv = require("iconv-lite");
//======================================================================
// 共通部の定義
//======================================================================
// APIを呼び出すURLを設定する
const baseURLString = 'http://yourserver/TimeTrackerNX/api';
// サーバースペックに合わせてウェイト時間を設定する
// 1分間に1500件程度の処理に収まるようするため、
// 目安として推奨スペックでは100ms程度とする
const requestWaitTime = 100; //単位:ms
//----------------------------------------------------------------------
// Web API間の処理待ち関数
//----------------------------------------------------------------------
async function wait(time){
const d1 = new Date();
while (true) {
const d2 = new Date();
if (d2 - d1 > time) {
break;
}
}
}
//======================================================================
// メイン処理
//======================================================================
main();
async function main(){
// 引数チェック
if (process.argv.length < 3){
return 'enter username and password';
}
const userName = process.argv[2];
var pass;
var authString; //ブロック内スコープから外に出すためvarで宣言(固定値)
// 引数でパスワードが未入力の場合は空白とみなす
if (process.argv.length > 3){
pass = process.argv[3];
} else {
pass = '';
}
// 認証情報を取得する
var sendUrl = baseURLString + '/auth/token';
try{
const { data } = await axios.post(
sendUrl,
{
loginName : userName,
password : pass
},
/*
// https通信時に使用する
httpsAgent : new https.Agent({
rejectUnauthorized: false
})
*/
);
authString = 'Bearer ' + data.token;
} catch (err) {
console.log(err);
}
// 以降のAPI通信で利用する送信ヘッダを作成する
const request = axios.create({
baseURL : baseURLString,
headers :{
'Authorization' : authString
},
/*
// https通信時に使用する
httpsAgent : new https.Agent({
rejectUnauthorized: false
})
*/
});
// 期間を指定して情報を取得
var sendUrl = '/analytics/timeEntities';
// 工数分析データの取得 (リクエストに分析の条件を設定して送信)
try {
const { data } = await request.post(
sendUrl,
{
// 集計対象を実績工数の合計に設定
'fields' : [{'name': 'actualTime','calcBy': 'sum' }],
// 集計単位をプロジェクトに設定
'groups' : [{'name': 'project','granularity': 'project' }],
// 3つの条件すべてに一致するデータを取得する(AND条件)
'filterBy' : {
'type' : 'and',
'children': [{
// 条件1:プロジェクトIDが4
'type': 'eq',
'left': {'name': 'projectId', 'type': 'field'},
'right': { 'type': 'value', 'value': '4'}
}, {
// 条件2:日付が2019/01/01以降
'type': 'ge',
'left': {'type': 'field','name': 'date'},
'right': {'type': 'value','value': '2019/01/01'}
}, {
// 条件3:日付が2019/03/31以前
'type': 'le',
'left': {'type': 'field', 'name': 'date'},
'right': {'type': 'value', 'value': '2019/03/31'}
}]
}
}
);
// 取得したデータをCSV形式で出力する
outputData(data);
} catch (e) {
console.log(e);
}
}
function outputData(data){
var filepath = './test_output.csv';
var buffer;
// ヘッダを追加
buffer = 'ProjectId,ProjectName,actualTime\n';
fs.writeFileSync(filepath, iconv.encode(buffer, 'Shift_JIS'), function(err){
if (err) {
console.log(err);
}
});
// 1行分ごとにデータをファイルへ追記する
for (var key in data.factData){
var array = [
data.factData[key].values.projectId,
data.factData[key].values.projectName,
data.factData[key].values.actualTime
]
buffer = array.join(',') + '\n';
fs.appendFileSync(filepath, iconv.encode(buffer, 'Shift_JIS'), function(err){
if (err) {
console.log(err);
}
});
}
}