forked from tszpinda/worklog-jira
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
81 lines (62 loc) · 2.72 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
require('request').defaults({proxy: process.env.HTTP_PROXY})
const JiraApi = require('jira').JiraApi;
const assert = require('assert');
const config = require('./config');
var jira = new JiraApi('https', config.host, config.port, config.user, config.password, 'latest');
jira.searchJira(`worklogAuthor = '${config.filter.worklogAuthor}'
AND worklogDate >= '${config.filter.startDate}'
AND worklogDate <= '${config.filter.endDate}'`, {fields: ['worklog']}, printResults)
function printResults(err, res) {
if(err) throw err;
let worklogs = res.issues
.map(i => i.fields.worklog)
.map(worklog => worklog.worklogs)
.reduce(flattenWorklogs)
.filter(filterByUser);
const totalSec = worklogs
.map(issue => issue.timeSpentSeconds)
.reduce((timeSum, time) => timeSum + time);
const quickTotals = output(totalSec);
const timePerIssueObj = worklogs.reduce(groupTimePerIssue, {});
const timePerIssueArr = convertObjectKeysToArray(timePerIssueObj);
let nice = timePerIssueArr.map(group => {
const org = res.issues.find(issue => issue.id == group.issueId);
group.jira = org.key;
const out = output(group.timeSpentSeconds);
console.log(org.key, '|', round(out.totalHours), '|', round(out.amount));
return{jira: org.key, totalHours: out.totalHours, amount: out.amount};
});
const totals = nice.reduce((group, entry) => {
group.hours += entry.totalHours;
group.amount += entry.amount;
return group;
}, {hours: 0, amount: 0});
console.log('Total Hours:', round(totals.hours), 'Total Amount:', round(totals.amount));
assert.equal(round(totals.hours), round(quickTotals.totalHours));
assert.equal(round(totals.amount), round(quickTotals.amount));
}
function output(seconds) {
const totalMin = seconds / 60;
const totalHours = totalMin / 60;
return{totalMinutes: totalMin, totalHours: totalHours, amount: totalHours * config.hourlyRate};
}
function filterByUser(issue) {
return issue.author.displayName === config.filter.worklogAuthor
}
function round(aNumber){
return parseFloat(aNumber).toFixed(2);
}
function flattenWorklogs(worklogList1, worklogList2) {
return worklogList1.concat(worklogList2);
}
function groupTimePerIssue(groups, issue) {
let issueGroup = groups[issue.issueId];
if(!issueGroup)
issueGroup = {issueId: issue.issueId, timeSpentSeconds: 0};
issueGroup.timeSpentSeconds += issue.timeSpentSeconds;
groups[issue.issueId] = issueGroup;
return groups;
}
function convertObjectKeysToArray(obj) {
return Object.keys(obj).map(key => obj[key]);
}