プロジェクト単位で当該期間の工数を出力する
概要
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); } }); } }