Project Estimation using a grid
The Project Estimation use case help user to create default rows in a grid to list the project phases, especially for organization who want to estimate projects phases using Table Grid app, with any kind of Project Management methodology (Agile or others) and also familiar with using Jira.
You will also learn how to use several features in TGNG app such as:
Introduction
The Project Estimation use case help user to create default rows in a grid to list the project phases, especially for organization who want to estimate projects phases using Table Grid app, with any kind of Project Management methodology (Agile or others ) and also familiar with using Jira.
The total estimation can then be copied to Time Tracking field (Original Estimate field) in Jira using Java APIs.
Prerequisites
User logged into their account, installed Table Grid Next Generation App
User created a related Jira project
User had the admin role on Jira
Post-condition
User can use the grid to update related information for the list of items
User can create issues using the Project Estimate grid
User can download/upload the Configuration for personal usage
User can add more columns or default rows to support the project estimation such as: Stakeholders, DateTime,…
Conditions
Required fields are marked with a red asterisk *
The grid must contain at least one column
The grid can be displayed in more than one project
User can download/upload the config for future usage in other project/issues.
When adding new columns or save the configuration, user need to reindex JIRA in order to changes to take effect.
When clicking the box Cell value required, user need to fill the information in the cell.
Flow chart diagram
Creating Project Estimation configuration
Basic Flow
Action | |
---|---|
1 | Click Add Grid |
2 | Fill information for “Name”
|
3 | In “Scopes”, select your Projects and Issue Types on which you want to display the grid |
4 | In Add Column, choose Sequence in Column type |
5 | User fill information for Identifier and Title In this example, writer used “jno“ as Identifier and type “No” as column Title |
6 | Click Add to save the information |
7 | Click Add new column to create new column |
8 | In Add Column, choose String in Column type |
9 | User fill information for Identifier and Title Type “jphase“ as Identifier and type “Project Phase” as Title Tick the box Cell value required to make sure default value to be used in each cell of column.
|
10 | Click Add to save the information |
11 | In Add Column, choose Number in Column type |
12 | User fill information for Identifier and Title In this example, writer typed “jestimate“ as Identifier and type “Estimation (in hours)” as Title Tick the box Cell value required to make sure default value to be used in each cell of column. In Aggregation operation, click button to choose sum option which calculate the sum of the column. |
13 | Click Add to save the column information |
14 | In Add Column, choose String in Column type Type “jnote” as Identifier and Type the “Note” as column Title |
15 | Click Add to save the information |
16 | User click button to add row in the grid |
17 | Based on your individual purpose, you can fill information for each column by double click the cell. For example, writer used: “Planning, Specification, Design, Development, Test, Review, Release and Documentation” for Project Phase column. Click Save button to save the config. |
Exceptional Flow
Users click “Cancel” when saving the config
Continued from step #17 in the Basic Flow:
Step | Description |
18 | The system shows a pop-up message: “Exit without saving?” |
19 | User click Yes button |
Use case stops. |
Use the Project Estimation grid in a Jira Project
Open your issue
Click Grid button to open Project Estimate grid
Click button to edit the grid
Fill estimate time (in hours) in the grid
Click to save the grid
You can view the total estimate time
Going further using TGNG REST APIs
After estimation being done using the grid, we can copy the project estimation total column from the Project Estimation grid to Original Estimate field in Jira Time Tracking feature.
You will need to use an external app like ScriptRunner for Jira | Atlassian Marketplace for scripting in Jira to be able to use TGNG REST APIs.
This script can be used during a transition workflow once the estimation of all phases are Done.
You can use the Custom script post-function feature from ScriptRunner app: https://docs.adaptavist.com/sr4js/latest/features/workflows/post-functions/custom-post-functions
Edit your project’s Workflow
Navigate to Workflows, click button on your project, select Edit
Click on Done
In Post Functions tab, click on Add post function
Choose ScriptRunner Post-Function, then click on Add
Choose Run Script
Write the below script in Condition:
Read more inREST APIs to know how to take the Grid ID and Cloud Authorization String
import groovy.json.JsonSlurper;
// Specify the issue key to update
String issueKey = issue.key
String gridId = "..." //Change the grid ID to relevant one
String authorizationStringCloud = "Basic ..." //Change the Cloud authorization string to relevant one
String baseURL = "https://databuckets.net/rest/tgc/api/v1/grids/" + gridId + "/issue/" + issueKey;
def responseData
StringBuilder responseError = new StringBuilder()
// Getting the Grid information from the Jira Cloud instance
try {
URL url;
url = new URL(baseURL);
URLConnection connection = url.openConnection();
connection.setRequestMethod("GET")
connection.setRequestProperty("Authorization", authorizationStringCloud)
connection.doOutput = true
connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8")
connection.connect();
int responseCode = connection.getResponseCode()
if(responseCode != 200){
responseError.append(connection.getErrorStream().text)
return responseError;
}else{
String response = connection.getInputStream().getText()
def jsonSlurper = new JsonSlurper()
responseData = jsonSlurper.parseText(response)
}
} catch(java.io.IOException ex) {
responseError.append("!! exception !!");
return responseError;
}
// Calculate the total estimation
double totalEstimation = 0.00
def rows = responseData.rows
if (rows != null) {
responseData.rows.each { row ->
def estimate = row.columns.get("jestimate")
if (estimate != null)
totalEstimation += estimate.doubleValue()
}
}
else {
responseError.append("Field \"rows\" does not exist in response!");
return responseError;
}
// Update field "Original estimate" of issue
def result = put("/rest/api/2/issue/${issueKey}")
.header('Content-Type', 'application/json')
.body([
update: [
timetracking: [
[
edit: [
originalEstimate: totalEstimation.toString() + "h"
]
]
]
]
]).asString()
// Validate the issue updated correctly
if (result.status == 204) {
return "Success - The issue with the key of ${issueKey} has been updated with a new original estimation: ${totalEstimation}h"
} else {
return "${result.status}: ${result.body}"
}
Click Add to add parameters to function
Final result on the issue view
When the issue status is “To Do”: the Original Estimate field in Jira isn’t updated with the Total from the estimation column in the grid.
Result: After using a transition to the status Done, Original Estimate field in Jira is updated with the Total from the estimation column in the grid.