jsharmony-workflow 1.0.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/jsHarmonyWorkflowProcessor.js +6 -6
- package/jsHarmonyWorkflowTransform.Classic.js +1 -0
- package/jsHarmonyWorkflowTransform.js +1 -0
- package/lint.cmd +1 -2
- package/models/Admin/WkflowDef_State_Listing.json +1 -1
- package/models/Reports/Task_Perf.ejs +79 -0
- package/models/Reports/Task_Perf.json +60 -0
- package/models/Reports/WkflowState_Perf.ejs +86 -0
- package/models/Reports/WkflowState_Perf.json +52 -0
- package/models/Reports/Wkflow_Perf.ejs +76 -0
- package/models/Reports/Wkflow_Perf.json +54 -0
- package/models/_config.json +4 -0
- package/models/sql/objects/wkflow.json +2 -2
- package/package.json +1 -1
|
@@ -183,7 +183,7 @@ module.exports = exports = function jsHarmonyWorkflowProcessor(module){
|
|
|
183
183
|
row.wkflow_def_state_type = (row.wkflow_def_state_type||'').toString().toUpperCase();
|
|
184
184
|
if(row.wkflow_def_sts!='ACTIVE'){ hasInvalidWorkflows = true; return; }
|
|
185
185
|
if(row.wkflow_def_state_sts!='ACTIVE'){ hasInvalidWorkflows = true; return; }
|
|
186
|
-
if((row.wkflow_def_state_type=='
|
|
186
|
+
if((row.wkflow_def_state_type=='TERMINAL') && (row.wkflow_tran_sts=='COMPLETE')){ hasTerminalWorkflows = true; return; }
|
|
187
187
|
if(!wkflows[row.wkflow_id]){
|
|
188
188
|
wkflows[row.wkflow_id] = _.extend(row, {
|
|
189
189
|
tran: {},
|
|
@@ -210,8 +210,8 @@ module.exports = exports = function jsHarmonyWorkflowProcessor(module){
|
|
|
210
210
|
//Process workflow variables
|
|
211
211
|
for(var i=0;i<rs_wkflow_var.length;i++){
|
|
212
212
|
let row = rs_wkflow_var[i];
|
|
213
|
-
|
|
214
|
-
if(!wkflow)
|
|
213
|
+
let wkflow = wkflows[row.wkflow_id];
|
|
214
|
+
if(!wkflow) continue;
|
|
215
215
|
var wkflow_var_name_ucase = (row.wkflow_var_name||'').toString().toUpperCase();
|
|
216
216
|
wkflow.var[wkflow_var_name_ucase] = row.wkflow_var_val;
|
|
217
217
|
}
|
|
@@ -239,8 +239,8 @@ module.exports = exports = function jsHarmonyWorkflowProcessor(module){
|
|
|
239
239
|
//Process state transitions
|
|
240
240
|
for(let i=0;i<rs_wkflow_tran.length;i++){
|
|
241
241
|
let row = rs_wkflow_tran[i];
|
|
242
|
-
|
|
243
|
-
if(!wkflow)
|
|
242
|
+
let wkflow = wkflows[row.wkflow_id];
|
|
243
|
+
if(!wkflow) continue;
|
|
244
244
|
if(row.wkflow_def_state_id_dst){
|
|
245
245
|
if(!wkflow.tran[row.wkflow_def_state_id_dst]){
|
|
246
246
|
wkflow.tran[row.wkflow_def_state_id_dst] = [];
|
|
@@ -299,7 +299,7 @@ module.exports = exports = function jsHarmonyWorkflowProcessor(module){
|
|
|
299
299
|
' from {schema}.wkflow w',
|
|
300
300
|
' left outer join {schema}.wkflow_def wd on wd.wkflow_def_id = w.wkflow_def_id',
|
|
301
301
|
' left outer join {schema}.wkflow_def_state wsd on wsd.wkflow_def_state_id = w.wkflow_def_state_id',
|
|
302
|
-
" where wkflow_sts='ACTIVE' and
|
|
302
|
+
" where wkflow_sts='ACTIVE' and wkflow_def_state_type = 'TERMINAL'",
|
|
303
303
|
' )',
|
|
304
304
|
].join(' ');
|
|
305
305
|
appsrv.ExecCommand('wkflow', module.replaceSchema(sql), [], {}, function (err) {
|
package/lint.cmd
CHANGED
|
@@ -1,2 +1 @@
|
|
|
1
|
-
call eslint --fix *.js
|
|
2
|
-
call eslint --fix models\_*.js
|
|
1
|
+
call eslint --fix *.js
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
" xtran as (",
|
|
14
14
|
" select wkflow_def_state_id xstate_id, 0 xlevel",
|
|
15
15
|
" from {schema}.wkflow_def_state",
|
|
16
|
-
" where not exists(select * from {schema}.wkflow_def_state_tran where wkflow_def_state_id_dst=wkflow_def_state.wkflow_def_state_id)",
|
|
16
|
+
" where not exists(select * from {schema}.wkflow_def_state_tran where wkflow_def_state_id_dst=wkflow_def_state.wkflow_def_state_id and wkflow_def_state_id_src is not null)",
|
|
17
17
|
" union all",
|
|
18
18
|
" select wkflow_def_state_id_dst xstate_id, xlevel + 1 xlevel",
|
|
19
19
|
" from {schema}.wkflow_def_state_tran",
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<title></title>
|
|
6
|
+
<style type="text/css">
|
|
7
|
+
* {
|
|
8
|
+
overflow:visible !important;
|
|
9
|
+
font-family: 'Roboto'; /*, arial, helvetica, sans-serif;*/
|
|
10
|
+
}
|
|
11
|
+
td { vertical-align:top; font-size:19px; font-weight:bold; padding: 5px 10px 5px 10px; }
|
|
12
|
+
body {
|
|
13
|
+
width:950px;
|
|
14
|
+
}
|
|
15
|
+
.pagebreak {
|
|
16
|
+
display: block;
|
|
17
|
+
page-break-before: always;
|
|
18
|
+
}
|
|
19
|
+
</style>
|
|
20
|
+
</head>
|
|
21
|
+
<body>
|
|
22
|
+
<h3 align='center' style="font-size:14px;font-family:'Roboto';">
|
|
23
|
+
<div align='center' style='padding-top:5px;font-size:20px;'>TASK PERFORMANCE REPORT</div>
|
|
24
|
+
</h3>
|
|
25
|
+
|
|
26
|
+
<div style="clear:both;padding-bottom:20px;"></div>
|
|
27
|
+
|
|
28
|
+
<!-- For Each global Record -->
|
|
29
|
+
<% _.each(data.global,function(global,global_i){ %>
|
|
30
|
+
|
|
31
|
+
<table width="100%" cellspacing="0" cellpadding="2" style="padding-top:0px;">
|
|
32
|
+
<tbody>
|
|
33
|
+
<tr class="C1_BODY_NOLINE" style="vertical-align:top">
|
|
34
|
+
<td align="right">Period:</td>
|
|
35
|
+
<td align="left" ><%=moment.utc(params.dt_from).format('MM/DD/YYYY')%> to <%=moment.utc(params.dt_to).format('MM/DD/YYYY')%></td>
|
|
36
|
+
<td align="right">Workflow:</td>
|
|
37
|
+
<td align="left" ><%=global.wkflow_def_name%></td>
|
|
38
|
+
</tr>
|
|
39
|
+
</tbody>
|
|
40
|
+
</table>
|
|
41
|
+
|
|
42
|
+
<% }); %><!-- End global Loop -->
|
|
43
|
+
|
|
44
|
+
<div style="clear:both;padding-bottom:35px;"></div>
|
|
45
|
+
|
|
46
|
+
<table width="100%" cellspacing="0" cellpadding="2" border="1" style="border-top:0;border-left:0;">
|
|
47
|
+
<thead>
|
|
48
|
+
<tr class="C1_HEAD">
|
|
49
|
+
<td style="border-left:0;border-top:0;border-right:0;"></td>
|
|
50
|
+
<td style="border-left:0;border-top:0;"></td>
|
|
51
|
+
<td colspan="3" align="center">Completion Time (Days)</td>
|
|
52
|
+
</tr>
|
|
53
|
+
<tr class="C1_HEAD">
|
|
54
|
+
<td align="left">Workflow</td>
|
|
55
|
+
<td align="left">Task</td>
|
|
56
|
+
<td align="right">Min</td>
|
|
57
|
+
<td align="right">Avg</td>
|
|
58
|
+
<td align="right">Max</td>
|
|
59
|
+
</tr>
|
|
60
|
+
</thead>
|
|
61
|
+
<tbody>
|
|
62
|
+
<!-- For Each perf_data Record -->
|
|
63
|
+
<% _.each(data.perf_data,function(perf_data,perf_data_i){ %>
|
|
64
|
+
<tr class="C1_BODY" style="vertical-align:top">
|
|
65
|
+
<td align="left" >{{perf_data.wkflow_def_name}}</td>
|
|
66
|
+
<td align="left" >{{perf_data.task_def_name}}</td>
|
|
67
|
+
<td align="right" >{{perf_data.duration_days_min}}</td>
|
|
68
|
+
<td align="right" ><% if(perf_data.duration_days_avg){ %><%=perf_data.duration_days_avg.toFixed(2)%><% } %></td>
|
|
69
|
+
<td align="right" >{{perf_data.duration_days_max}}</td>
|
|
70
|
+
</tr>
|
|
71
|
+
<% }); %><!-- End perf_data Loop -->
|
|
72
|
+
</tbody>
|
|
73
|
+
</table>
|
|
74
|
+
<br/>
|
|
75
|
+
<!-- commented out
|
|
76
|
+
-->
|
|
77
|
+
|
|
78
|
+
</body>
|
|
79
|
+
</html>
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Task_Perf": {
|
|
3
|
+
"layout": "report",
|
|
4
|
+
"title": "Task Performance",
|
|
5
|
+
"actions": "B",
|
|
6
|
+
"menu":"Reports/Task_Perf",
|
|
7
|
+
"description": "Task Performance Report",
|
|
8
|
+
"pagesettings": {"orientation": "portrait"},
|
|
9
|
+
"onecolumn": true,
|
|
10
|
+
"fields": [
|
|
11
|
+
{"name": "dt_from","caption": "Date From","type": "date","control": "date_mmddyy","validate": [ "Required" ],"default": "js:moment().add(-1, 'month').format()"},
|
|
12
|
+
{"name": "dt_to","caption": "To","type": "date","control": "date_mmddyy", "validate": [ "Required" ],"default": "js:moment().format()","captionstyle":"width:30px;text-align:right;", "nl": false},
|
|
13
|
+
{"name":"wkflow_def_code","caption": "Workflow","type":"varchar","length":16,"actions":"B","nl":1,"control":"dropdown_S",
|
|
14
|
+
"lov": {"sql":"select wkflow_def_code codeval,wkflow_def_name codetxt from wkflow.wkflow_def where 1=1 order by wkflow_def_name ","blank":"(All)"} },
|
|
15
|
+
{"control":"button","value":"Run Report","controlstyle": "padding:3px 8px;","nl": true,"onclick": "jsh.XPage.RunReport();","caption":""},
|
|
16
|
+
//{"control":"button","value":"Preview Report","controlstyle": "padding:3px 8px;","nl": true,"onclick": "jsh.XPage.RunReportHTML();","caption":""},
|
|
17
|
+
],
|
|
18
|
+
"reportdata" : {
|
|
19
|
+
"global":{
|
|
20
|
+
"sql":[
|
|
21
|
+
"select $iif(@wkflow_def_code is null,'(All)',(select wkflow_def_name from wkflow.wkflow_def where wkflow_def_code = @wkflow_def_code)) wkflow_def_name ",
|
|
22
|
+
" from jsharmony.single",
|
|
23
|
+
" where 1=1 %%%DATALOCKS%%% "
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
"perf_data":{
|
|
27
|
+
"sql":[
|
|
28
|
+
"select wkflow_def_name, ",
|
|
29
|
+
" task_def_name, ",
|
|
30
|
+
" min(duration_days) duration_days_min, ",
|
|
31
|
+
" max(duration_days) duration_days_max, ",
|
|
32
|
+
" cast(round(avg(duration_days*1.0),2) as decimal(9,2)) duration_days_avg ",
|
|
33
|
+
"from ( ",
|
|
34
|
+
"select wkflow.wkflow_id, ",
|
|
35
|
+
" task.task_sts, ",
|
|
36
|
+
" task_sts_tstmp, ",
|
|
37
|
+
" task.task_etstmp, ",
|
|
38
|
+
" $iif(datediff(day, cast(task.task_etstmp as date),cast(task.task_sts_tstmp as date))=0,1, ",
|
|
39
|
+
" datediff(day, cast(task.task_etstmp as date),cast(task.task_sts_tstmp as date))) duration_days, ",
|
|
40
|
+
" wkflow.wkflow_def_id, ",
|
|
41
|
+
" wkflow_def.wkflow_def_code, ",
|
|
42
|
+
" wkflow_def.wkflow_def_name, ",
|
|
43
|
+
" task.task_def_id, ",
|
|
44
|
+
" task_def.task_def_code, ",
|
|
45
|
+
" task_def.task_def_name ",
|
|
46
|
+
" from wkflow.task ",
|
|
47
|
+
" inner join wkflow.wkflow on wkflow.wkflow_id = task.wkflow_id ",
|
|
48
|
+
" inner join wkflow.wkflow_def on wkflow_def.wkflow_def_id = wkflow.wkflow_def_id ",
|
|
49
|
+
" inner join wkflow.task_def on task_def.task_def_id = task.task_def_id ",
|
|
50
|
+
" where wkflow.wkflow_def_id = isnull((select wkflow_def_id from wkflow.wkflow_def where wkflow_def.wkflow_def_code=@wkflow_def_code),wkflow.wkflow_def_id) ",
|
|
51
|
+
" and task.task_sts = 'COMPLETE' ",
|
|
52
|
+
" and isnull(@dt_from, task.task_etstmp) <= task.task_etstmp ",
|
|
53
|
+
" and isnull(@dt_to, task.task_etstmp) >= task.task_etstmp ",
|
|
54
|
+
" ) x group by wkflow_def_name, task_def_name ",
|
|
55
|
+
" order by wkflow_def_name, task_def_name "
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<title></title>
|
|
6
|
+
<style type="text/css">
|
|
7
|
+
* {
|
|
8
|
+
overflow:visible !important;
|
|
9
|
+
font-family: 'Roboto'; /*, arial, helvetica, sans-serif;*/
|
|
10
|
+
}
|
|
11
|
+
td { vertical-align:top; font-size:19px; font-weight:bold; padding: 5px 10px 5px 10px; }
|
|
12
|
+
body {
|
|
13
|
+
width:950px;
|
|
14
|
+
}
|
|
15
|
+
.pagebreak {
|
|
16
|
+
display: block;
|
|
17
|
+
page-break-before: always;
|
|
18
|
+
}
|
|
19
|
+
</style>
|
|
20
|
+
</head>
|
|
21
|
+
<body>
|
|
22
|
+
<h3 align='center' style="font-size:14px;font-family:'Roboto';">
|
|
23
|
+
<div align='center' style='padding-top:5px;font-size:20px;'>WORKFLOW STATE PERFORMANCE REPORT</div>
|
|
24
|
+
</h3>
|
|
25
|
+
|
|
26
|
+
<div style="clear:both;padding-bottom:20px;"></div>
|
|
27
|
+
|
|
28
|
+
<!-- For Each global Record -->
|
|
29
|
+
<% _.each(data.global,function(global,global_i){ %>
|
|
30
|
+
|
|
31
|
+
<table width="100%" cellspacing="0" cellpadding="2" style="padding-top:0px;">
|
|
32
|
+
<tbody>
|
|
33
|
+
<tr class="C1_BODY_NOLINE" style="vertical-align:top">
|
|
34
|
+
<td align="right">Period:</td>
|
|
35
|
+
<td align="left" ><%=moment.utc(params.dt_from).format('MM/DD/YYYY')%> to <%=moment.utc(params.dt_to).format('MM/DD/YYYY')%></td>
|
|
36
|
+
<td align="right">Workflow:</td>
|
|
37
|
+
<td align="left" ><%=global.wkflow_def_name%></td>
|
|
38
|
+
</tr>
|
|
39
|
+
</tbody>
|
|
40
|
+
</table>
|
|
41
|
+
|
|
42
|
+
<% }); %><!-- End global Loop -->
|
|
43
|
+
|
|
44
|
+
<div style="clear:both;padding-bottom:35px;"></div>
|
|
45
|
+
|
|
46
|
+
<table width="100%" cellspacing="0" cellpadding="2" border="1" style="border-top:0;border-left:0;">
|
|
47
|
+
<thead>
|
|
48
|
+
<tr class="C1_HEAD">
|
|
49
|
+
<td style="border-left:0;border-top:0;border-right:0;"></td>
|
|
50
|
+
<td style="border-left:0;border-top:0;"></td>
|
|
51
|
+
<td colspan="3" align="center">Completion Time (Minutes)</td>
|
|
52
|
+
<td colspan="3" align="center">Completion Time (Days)</td>
|
|
53
|
+
</tr>
|
|
54
|
+
<tr class="C1_HEAD">
|
|
55
|
+
<td align="left">Workflow</td>
|
|
56
|
+
<td align="left">State</td>
|
|
57
|
+
<td align="right">Min</td>
|
|
58
|
+
<td align="right">Avg</td>
|
|
59
|
+
<td align="right">Max</td>
|
|
60
|
+
<td align="right">Min</td>
|
|
61
|
+
<td align="right">Avg</td>
|
|
62
|
+
<td align="right">Max</td>
|
|
63
|
+
</tr>
|
|
64
|
+
</thead>
|
|
65
|
+
<tbody>
|
|
66
|
+
<!-- For Each perf_data Record -->
|
|
67
|
+
<% _.each(data.perf_data,function(perf_data,perf_data_i){ %>
|
|
68
|
+
<tr class="C1_BODY" style="vertical-align:top">
|
|
69
|
+
<td align="left" >{{perf_data.wkflow_def_name}}</td>
|
|
70
|
+
<td align="left" >{{perf_data.wkflow_def_state_name}}</td>
|
|
71
|
+
<td align="right" >{{perf_data.duration_min}}</td>
|
|
72
|
+
<td align="right" ><% if(perf_data.duration_avg){ %><%=perf_data.duration_avg.toFixed(0)%><% } %></td>
|
|
73
|
+
<td align="right" >{{perf_data.duration_max}}</td>
|
|
74
|
+
<td align="right" >{{Math.ceil(perf_data.duration_min/(60*24))}}</td>
|
|
75
|
+
<td align="right" ><% if(perf_data.duration_avg){ %><%=(perf_data.duration_avg/(60*24)).toFixed(0)%><% } %></td>
|
|
76
|
+
<td align="right" >{{Math.ceil(perf_data.duration_max/(60*24))}}</td>
|
|
77
|
+
</tr>
|
|
78
|
+
<% }); %><!-- End perf_data Loop -->
|
|
79
|
+
</tbody>
|
|
80
|
+
</table>
|
|
81
|
+
<br/>
|
|
82
|
+
<!-- commented out
|
|
83
|
+
-->
|
|
84
|
+
|
|
85
|
+
</body>
|
|
86
|
+
</html>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"WkflowState_Perf": {
|
|
3
|
+
"layout": "report",
|
|
4
|
+
"title": "Workflow State Performance",
|
|
5
|
+
"actions": "B",
|
|
6
|
+
"menu":"Reports/WkflowState_Perf",
|
|
7
|
+
"description": "Workflow State Performance Report",
|
|
8
|
+
"pagesettings": {"orientation": "portrait"},
|
|
9
|
+
"onecolumn": true,
|
|
10
|
+
"fields": [
|
|
11
|
+
{"name": "dt_from","caption": "Date From","type": "date","control": "date_mmddyy","validate": [ "Required" ],"default": "js:moment().add(-1, 'month').format()"},
|
|
12
|
+
{"name": "dt_to","caption": "To","type": "date","control": "date_mmddyy", "validate": [ "Required" ],"default": "js:moment().format()","captionstyle":"width:30px;text-align:right;", "nl": false},
|
|
13
|
+
{"name":"wkflow_def_code","caption": "Workflow","type":"varchar","length":16,"actions":"B","nl":1,"control":"dropdown_S",
|
|
14
|
+
"lov": {"sql":"select wkflow_def_code codeval,wkflow_def_name codetxt from wkflow.wkflow_def where 1=1 order by wkflow_def_name ","blank":"(All)"} },
|
|
15
|
+
{"control":"button","value":"Run Report","controlstyle": "padding:3px 8px;","nl": true,"onclick": "jsh.XPage.RunReport();","caption":""},
|
|
16
|
+
//{"control":"button","value":"Preview Report","controlstyle": "padding:3px 8px;","nl": true,"onclick": "jsh.XPage.RunReportHTML();","caption":""},
|
|
17
|
+
],
|
|
18
|
+
"reportdata" : {
|
|
19
|
+
"global":{
|
|
20
|
+
"sql":[
|
|
21
|
+
"select $iif(@wkflow_def_code is null,'(All)',(select wkflow_def_name from wkflow.wkflow_def where wkflow_def_code = @wkflow_def_code)) wkflow_def_name ",
|
|
22
|
+
" from jsharmony.single",
|
|
23
|
+
" where 1=1 %%%DATALOCKS%%% "
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
"perf_data":{
|
|
27
|
+
"sql":[
|
|
28
|
+
"select wkflow_def_name, ",
|
|
29
|
+
" wkflow_def_state_name, ",
|
|
30
|
+
" min(duration_minutes) duration_min, ",
|
|
31
|
+
" max(duration_minutes) duration_max, ",
|
|
32
|
+
" cast(round(avg(duration_minutes*1.0),2) as decimal(9,2)) duration_avg ",
|
|
33
|
+
"from ( ",
|
|
34
|
+
"select wkflow_state.wkflow_id, ",
|
|
35
|
+
" sum(datediff(minute, wkflow_state.wkflow_state_start_tstmp, wkflow_state.wkflow_state_end_tstmp)) duration_minutes, ",
|
|
36
|
+
" wkflow_def.wkflow_def_name, ",
|
|
37
|
+
" wkflow_def_state.wkflow_def_state_name ",
|
|
38
|
+
" from wkflow.wkflow_state ",
|
|
39
|
+
" inner join wkflow.wkflow on wkflow.wkflow_id = wkflow_state.wkflow_id ",
|
|
40
|
+
" inner join wkflow.wkflow_def on wkflow_def.wkflow_def_id = wkflow.wkflow_def_id ",
|
|
41
|
+
" inner join wkflow.wkflow_def_state on wkflow_def_state.wkflow_def_state_id = wkflow_state.wkflow_def_state_id ",
|
|
42
|
+
" where wkflow.wkflow_def_id = isnull((select wkflow_def_id from wkflow.wkflow_def where wkflow_def.wkflow_def_code=@wkflow_def_code),wkflow.wkflow_def_id) ",
|
|
43
|
+
" and isnull(@dt_from, wkflow_state.wkflow_state_start_tstmp) <= wkflow_state.wkflow_state_start_tstmp ",
|
|
44
|
+
" and isnull(@dt_to, wkflow_state.wkflow_state_start_tstmp) >= wkflow_state.wkflow_state_start_tstmp ",
|
|
45
|
+
" group by wkflow_state.wkflow_id, wkflow_def.wkflow_def_name, wkflow_def_state.wkflow_def_state_name ",
|
|
46
|
+
" ) x group by wkflow_def_name, wkflow_def_state_name ",
|
|
47
|
+
" order by wkflow_def_name, wkflow_def_state_name "
|
|
48
|
+
]
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<title></title>
|
|
6
|
+
<style type="text/css">
|
|
7
|
+
* {
|
|
8
|
+
overflow:visible !important;
|
|
9
|
+
font-family: 'Roboto'; /*, arial, helvetica, sans-serif;*/
|
|
10
|
+
}
|
|
11
|
+
td { vertical-align:top; font-size:19px; font-weight:bold; padding: 5px 10px 5px 10px; }
|
|
12
|
+
body {
|
|
13
|
+
width:950px;
|
|
14
|
+
}
|
|
15
|
+
.pagebreak {
|
|
16
|
+
display: block;
|
|
17
|
+
page-break-before: always;
|
|
18
|
+
}
|
|
19
|
+
</style>
|
|
20
|
+
</head>
|
|
21
|
+
<body>
|
|
22
|
+
<h3 align='center' style="font-size:14px;font-family:'Roboto';">
|
|
23
|
+
<div align='center' style='padding-top:5px;font-size:20px;'>WORKFLOW PERFORMANCE REPORT</div>
|
|
24
|
+
</h3>
|
|
25
|
+
|
|
26
|
+
<div style="clear:both;padding-bottom:20px;"></div>
|
|
27
|
+
|
|
28
|
+
<!-- For Each global Record -->
|
|
29
|
+
<% _.each(data.global,function(global,global_i){ %>
|
|
30
|
+
|
|
31
|
+
<table width="100%" cellspacing="0" cellpadding="2" style="padding-top:0px;">
|
|
32
|
+
<tbody>
|
|
33
|
+
<tr class="C1_BODY_NOLINE" style="vertical-align:top">
|
|
34
|
+
<td align="right">Period:</td>
|
|
35
|
+
<td align="left" ><%=moment.utc(params.dt_from).format('MM/DD/YYYY')%> to <%=moment.utc(params.dt_to).format('MM/DD/YYYY')%></td>
|
|
36
|
+
<td align="right">Workflow:</td>
|
|
37
|
+
<td align="left" ><%=global.wkflow_def_name%></td>
|
|
38
|
+
</tr>
|
|
39
|
+
</tbody>
|
|
40
|
+
</table>
|
|
41
|
+
|
|
42
|
+
<% }); %><!-- End global Loop -->
|
|
43
|
+
|
|
44
|
+
<div style="clear:both;padding-bottom:35px;"></div>
|
|
45
|
+
|
|
46
|
+
<table width="100%" cellspacing="0" cellpadding="2" border="1" style="border-top:0;border-left:0;">
|
|
47
|
+
<thead>
|
|
48
|
+
<tr class="C1_HEAD">
|
|
49
|
+
<td style="border-left:0;border-top:0;"></td>
|
|
50
|
+
<td colspan="3" align="center">Completion Time (Days)</td>
|
|
51
|
+
</tr>
|
|
52
|
+
<tr class="C1_HEAD">
|
|
53
|
+
<td align="left">Workflow</td>
|
|
54
|
+
<td align="right">Min</td>
|
|
55
|
+
<td align="right">Avg</td>
|
|
56
|
+
<td align="right">Max</td>
|
|
57
|
+
</tr>
|
|
58
|
+
</thead>
|
|
59
|
+
<tbody>
|
|
60
|
+
<!-- For Each perf_data Record -->
|
|
61
|
+
<% _.each(data.perf_data,function(perf_data,perf_data_i){ %>
|
|
62
|
+
<tr class="C1_BODY" style="vertical-align:top">
|
|
63
|
+
<td align="left">{{perf_data.wkflow_def_name}}</td>
|
|
64
|
+
<td align="right" >{{perf_data.duration_days_min}}</td>
|
|
65
|
+
<td align="right" ><% if(perf_data.duration_days_avg){ %><%=perf_data.duration_days_avg.toFixed(2)%><% } %></td>
|
|
66
|
+
<td align="right" >{{perf_data.duration_days_max}}</td>
|
|
67
|
+
</tr>
|
|
68
|
+
<% }); %><!-- End perf_data Loop -->
|
|
69
|
+
</tbody>
|
|
70
|
+
</table>
|
|
71
|
+
<br/>
|
|
72
|
+
<!-- commented out
|
|
73
|
+
-->
|
|
74
|
+
|
|
75
|
+
</body>
|
|
76
|
+
</html>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"Wkflow_Perf": {
|
|
3
|
+
"layout": "report",
|
|
4
|
+
"title": "Workflow Performance",
|
|
5
|
+
"actions": "B",
|
|
6
|
+
"menu":"Reports/Wkflow_Perf",
|
|
7
|
+
"description": "Workflow Performance Report",
|
|
8
|
+
"pagesettings": {"orientation": "portrait"},
|
|
9
|
+
"onecolumn": true,
|
|
10
|
+
"fields": [
|
|
11
|
+
{"name": "dt_from","caption": "Date From","type": "date","control": "date_mmddyy","validate": [ "Required" ],"default": "js:moment().add(-1, 'month').format()"},
|
|
12
|
+
{"name": "dt_to","caption": "To","type": "date","control": "date_mmddyy", "validate": [ "Required" ],"default": "js:moment().format()","captionstyle":"width:30px;text-align:right;", "nl": false},
|
|
13
|
+
{"name":"wkflow_def_code","caption": "Workflow","type":"varchar","length":16,"actions":"B","nl":1,"control":"dropdown_S",
|
|
14
|
+
"lov": {"sql":"select wkflow_def_code codeval,wkflow_def_name codetxt from wkflow.wkflow_def where 1=1 order by wkflow_def_name ","blank":"(All)"} },
|
|
15
|
+
{"control":"button","value":"Run Report","controlstyle": "padding:3px 8px;","nl": true,"onclick": "jsh.XPage.RunReport();","caption":""},
|
|
16
|
+
//{"control":"button","value":"Preview Report","controlstyle": "padding:3px 8px;","nl": true,"onclick": "jsh.XPage.RunReportHTML();","caption":""},
|
|
17
|
+
],
|
|
18
|
+
"reportdata" : {
|
|
19
|
+
"global":{
|
|
20
|
+
"sql":[
|
|
21
|
+
"select $iif(@wkflow_def_code is null,'(All)',(select wkflow_def_name from wkflow.wkflow_def where wkflow_def_code = @wkflow_def_code)) wkflow_def_name ",
|
|
22
|
+
" from jsharmony.single",
|
|
23
|
+
" where 1=1 %%%DATALOCKS%%% "
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
"perf_data":{
|
|
27
|
+
"sql":[
|
|
28
|
+
"select wkflow_def_name, ",
|
|
29
|
+
" min(duration_days) duration_days_min, ",
|
|
30
|
+
" max(duration_days) duration_days_max, ",
|
|
31
|
+
" cast(round(avg(duration_days*1.0),2) as decimal(9,2)) duration_days_avg ",
|
|
32
|
+
"from ( ",
|
|
33
|
+
"select wkflow.wkflow_id, ",
|
|
34
|
+
" wkflow.wkflow_sts, ",
|
|
35
|
+
" wkflow_sts_tstmp, ",
|
|
36
|
+
" wkflow.wkflow_etstmp, ",
|
|
37
|
+
" $iif(datediff(day, cast(wkflow.wkflow_etstmp as date),cast(wkflow.wkflow_sts_tstmp as date))=0,1, ",
|
|
38
|
+
" datediff(day, cast(wkflow.wkflow_etstmp as date),cast(wkflow.wkflow_sts_tstmp as date))) duration_days, ",
|
|
39
|
+
" wkflow.wkflow_def_id, ",
|
|
40
|
+
" wkflow_def.wkflow_def_code, ",
|
|
41
|
+
" wkflow_def.wkflow_def_name ",
|
|
42
|
+
" from wkflow.wkflow ",
|
|
43
|
+
" inner join wkflow.wkflow_def on wkflow_def.wkflow_def_id = wkflow.wkflow_def_id ",
|
|
44
|
+
" where wkflow.wkflow_def_id = isnull((select wkflow_def_id from wkflow.wkflow_def where wkflow_def.wkflow_def_code=@wkflow_def_code),wkflow.wkflow_def_id) ",
|
|
45
|
+
" and wkflow.wkflow_sts = 'COMPLETE' ",
|
|
46
|
+
" and isnull(@dt_from, wkflow.wkflow_etstmp) <= wkflow.wkflow_etstmp ",
|
|
47
|
+
" and isnull(@dt_to, wkflow.wkflow_etstmp) >= wkflow.wkflow_etstmp ",
|
|
48
|
+
" ) x group by wkflow_def_name ",
|
|
49
|
+
" order by wkflow_def_name "
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
package/models/_config.json
CHANGED
|
@@ -11,6 +11,10 @@
|
|
|
11
11
|
{ "menu_name": "Wkflow/Task_Listing_MyCurrent", "menu_desc": "My Current Tasks", "menu_cmd": "{namespace}Wkflow/Task_Listing_MyCurrent", "menu_subcmd": null, "menu_seq": 20003, "menu_id": 20003, "menu_parent_name": "Wkflow", "roles": { "main": [ "SYSADMIN", "DEV" ] } },
|
|
12
12
|
{ "menu_name": "Wkflow/Task_Listing_MyHistory", "menu_desc": "Task History", "menu_cmd": "{namespace}Wkflow/Task_Listing_MyHistory", "menu_subcmd": null, "menu_seq": 20004, "menu_id": 20004, "menu_parent_name": "Wkflow", "roles": { "main": [ "SYSADMIN", "DEV" ] } },
|
|
13
13
|
{ "menu_name": "Wkflow/Task_Listing_AllUsers", "menu_desc": "All User Tasks", "menu_cmd": "{namespace}Wkflow/Task_Listing_AllUsers", "menu_subcmd": null, "menu_seq": 20004, "menu_id": 20005, "menu_parent_name": "Wkflow", "roles": { "main": [ "SYSADMIN", "DEV" ] } },
|
|
14
|
+
|
|
15
|
+
{ "menu_name": "Reports/Wkflow_Perf", "menu_desc": "Workflow Performance", "menu_cmd": "{namespace}Reports/Wkflow_Perf", "menu_subcmd": null, "menu_seq": 70071, "menu_id": 70071, "menu_parent_name": "Reports", "roles": { "main": [ "SYSADMIN", "DEV" ] } },
|
|
16
|
+
{ "menu_name": "Reports/WkflowState_Perf", "menu_desc": "Workflow State Performance", "menu_cmd": "{namespace}Reports/WkflowState_Perf", "menu_subcmd": null, "menu_seq": 70072, "menu_id": 70072, "menu_parent_name": "Reports", "roles": { "main": [ "SYSADMIN", "DEV" ] } },
|
|
17
|
+
{ "menu_name": "Reports/Task_Perf", "menu_desc": "Task Performance", "menu_cmd": "{namespace}Reports/Task_Perf", "menu_subcmd": null, "menu_seq": 70073, "menu_id": 70072, "menu_parent_name": "Reports", "roles": { "main": [ "SYSADMIN", "DEV" ] } },
|
|
14
18
|
|
|
15
19
|
{ "menu_name": "Admin/WkflowDef_Listing", "menu_desc": "Workflow Definitions", "menu_cmd": "{namespace}Admin/WkflowDef_Listing", "menu_subcmd": null, "menu_seq": 80071, "menu_id": 80071, "menu_parent_name": "Admin", "roles": { "main": [ "SYSADMIN", "DEV" ] } },
|
|
16
20
|
{ "menu_name": "Admin/TaskDef_Listing", "menu_desc": "Task Definitions", "menu_cmd": "{namespace}Admin/TaskDef_Listing", "menu_subcmd": null, "menu_seq": 80072, "menu_id": 80072, "menu_parent_name": "Admin", "roles": { "main": [ "SYSADMIN", "DEV" ] } },
|
|
@@ -316,11 +316,11 @@
|
|
|
316
316
|
]
|
|
317
317
|
},
|
|
318
318
|
{ "on": ["update"], "exec": [
|
|
319
|
-
"jsharmony.log_audit_update_mult('wkflow',deleted(wkflow_id),[\"wkflow_def_id\",\"wkflow_tran_sts\",\"wkflow_def_state_id\",\"wkflow_custom_flag\",\"wkflow_custom_note\"])",
|
|
319
|
+
"jsharmony.log_audit_update_mult('wkflow',deleted(wkflow_id),[\"wkflow_def_id\",\"wkflow_sts\",\"wkflow_tran_sts\",\"wkflow_def_state_id\",\"wkflow_custom_flag\",\"wkflow_custom_note\"])",
|
|
320
320
|
]
|
|
321
321
|
},
|
|
322
322
|
{ "on": ["delete"], "exec": [
|
|
323
|
-
"jsharmony.log_audit_delete_mult('wkflow',deleted(wkflow_id),[\"wkflow_def_id\",\"wkflow_tran_sts\",\"wkflow_def_state_id\",\"wkflow_custom_flag\",\"wkflow_custom_note\"])",
|
|
323
|
+
"jsharmony.log_audit_delete_mult('wkflow',deleted(wkflow_id),[\"wkflow_def_id\",\"wkflow_sts\",\"wkflow_tran_sts\",\"wkflow_def_state_id\",\"wkflow_custom_flag\",\"wkflow_custom_note\"])",
|
|
324
324
|
]
|
|
325
325
|
}
|
|
326
326
|
],
|