Skip to content

プロジェクト単位で当該期間の工数を出力する

概要

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);
            }
        });
    }
}