Performance APP dashboards - kwantu/platformconfiguration GitHub Wiki
Setting up dashboards for the Performance App.
The nodeResult data object
- In the node result approved entry we are populating all the sequences upfront for all the reporting periods.
- So if plan is of two years duration, then node result approved will contain 24 sequences.
- validDate field represents each periodic cycle, and reportingDate field will contain the current reporting period in progress for the node. i.e. reportingDate will be same in all the sequences.
- For all the transformed values currently default function of SUM is implemented. Later we will provide a way to define other functions from UI. But for DALRRD Sum is the only requirement.
- Build is up on staging, so please start integration testing.
- I also created one service to populate the same for already captured nodes. Please ping me if you already have data captured and want to use that.
- If all sound good then please push this information to the document for later references.
- The structure of the node result is below with small description after the // about the field… please check that once…
{
"planningCycle": { // Blank - NOT IN USE
"code": "",
"label": ""
},
"planningDocument": { // Blank - NOT IN USE
"code": "",
"label": ""
},
"expectedResultsSummary": "", // Blank - NOT IN USE
"reportingDate": "2021-04-30”, // Current reporting period date
"nodeOutline": "1.1.1.1”, //Outline of the current node
"levelColorBackground": “", //Level background colour as per plan config
"levelColorForeground": "",//Level foreground colour as per plan config
"nodeLevel": “", //Levelnumber as per plan config
"levelName": "",//Level Name as per plan config
"nodeWeightToSiblings": “", //Weight of the node defined in nodeActivity
"nodeMilestoneLabel": “", //Label of Mile stone achieved
"performanceRules": “", //Weight calculation type (Simple Average/Weighted Average/Discrete Milestone)
"nodeName": "Improved programme/project effectiveness through evaluations”, //Label of the node
"responsibleOrg": “", //From plan form
"description": “", //NOT IN USE
"nodeUUID": "b4491cd5-b615-4190-a8c6-598b09402fff",//Node UUID
"validDate": "2021-04-30",//Valid date for the sequence
"aggrPerformanceNode”:””,//Aggregated Performance of the node calculated from the contribution of its children
"aggrPerformanceColourNode": { //Color as per aggregated performance of the node
"code": ":",
"label": ""
},
"averagePerformanceNode": “", //Average of the variance of "target - achieved” for all the questions on the node
"averagePerformanceColourForeground": “", //Average performance Foreground colour
"averagePerformanceColourBackground": “", //Average performance background colour
"reportedPerformance": “", //IF node contains questions then nodePerformance otherwise aggrPerformanceNode
"nodePerformance": “", //Performance of the node from its questions
"nodeColourPerformance": { //Color of the nodePerformance
"code": "",
"label": ""
},
"aggrTrDue": 1, //Count of all the questions in the node and all its descendants having a defined target (i.e number of question in entire branch where Target is not blank and not 0)
"aggrDueTrAchived": 1, //This attribute counts number of question where target was due AND value is captured
"progress": "",//Related to partner activity
"notStarted": “", ,//Related to partner activity
"complete": “", ,//Related to partner activity
"aggTrDenomNode": 0, ,//Count of targets achieved on the node (Doesn’t include children data) AND for the parent of disaggregated nodes (The capturing level) it will calculate on the basis of combinedPerf repeat
"aggrTrNotDue": 0, //Count of all the questions where target is either blank or 0 (Including self and entire branch) AND for the parent of disaggregated nodes (The capturing level) it will calculate on the basis of combinedPerf repeat
"aggTrValueNode": 0, //Count of Targets achived on descendant nodes (Does not include self) AND for the parent of disaggregated nodes (The capturing level) it will calculate on the basis of combinedPerf repeat
"nodeMilestoneLevel": “", //Milestone level
"nodeMilestoneName": "",//Milestone Name
"childPerformanceRepeat": { //Children data (This could be blank if children or any of its descendant is not captured yet. It will fill gradually if any of the node is captured at the leaf level)
"summary": "",
"header": "",
"childPerformanceRepeatdef": {
"childPerformanceRepeatData": [
{
"nodeOutline": "1.1.1.1",//Child outline
"aggrChildPerformance": 0, //aggrPerformanceNode of Child
"childColourPerformance": { //ColorreportiedPerformance
"uniqueIndex": "e5baa5ab",
"code": "#FF0000:#FFFFFF",
"label": "Red",
"_id": ""
},
"weightChildToSiblings": 100, //Weight as defined in nodeActivity
"aggrColourChildPerformance": {//Color aggrPerformanceNode
"uniqueIndex": "e5baa5ab",
"code": "#FF0000:#FFFFFF",
"label": "Red",
"_id": ""
},
"nodeLabel": "Improved programme/project effectiveness through evaluations",//Child label
"childPerformance": 0,//Child reportedPerformance
"nodeUUID": "ad2eabf8-e4bb-485b-bddd-64c825ebf47a",//UUID
"key": "",
"aggrTrDue": 1,//aggrTrDue of Child
"aggrDueTrAchived": 1, //aggrTrAchieved of child
"aggrTrNotDue": 0,//aggrTrNotDue of child
"aggTrValueNode": 0,//aggrTrValueNode of child
"reportedPerformance": 0//reportedPerformance of child
}
]
}
},
"parentInfoRepeat": {
"parentRepeatdef": {
"InfoRepeatData": [ //Ancestor node information
"parentLevelNumber": , //Level number of the parent
"parentUUID": , //UUID of the parent
"parentLabel"://Label of the parent
]
},
"summary": "",
"header": ""
},
"combinedPerf": {
"combinedRef": {
"combinedData": [ //Question information from disaggregated nodes
"label": //Question label,
"target": “", //Cumulative Target value from all disaagregated nodes
"actual": “", //Actual Value from all disaagregated nodes
"audit": “", // Audit Value from all disaagregated nodes
]
},
"summary": "",
"header": ""
}
"quesPerf": {
"quesRef": {
"quesData": [//Question information
"locked": //Boolean true/false,
"label": //Question label,
"target": “", //Target value
"actual": “", //Actual Value
"audit": “", // Audit Value
"percent": “", //Percent achived
"weight": “", //Weight of the question as defined in the field form to calculate the performance
"notDue": “", //Boolean true/false
"trColour": “", //NOT IN USE
"trValue": “" //1 if percent is 100% or above otherwise 0
]
},
"summary": "",
"header": ""
}
}
Data fields for a node
Field | Description |
---|---|
aggrTrDue | The number targets due for this node and children |
aggTrDenomNode | Duplicate of aggrTrDue |
aggrTrNotDue | The number of targets not due for this node and children |
aggrDueTrAchived | The number of targets that have been achieved given that they are due |
aggTrValueNode | The number of targets achieved even if not due |
nodePerformance | The performance of this node calculated from its children and itself |
aggrPerformanceNode | The performance of this node relative to its siblings (i.e. the weighted performance) |
reportedPerformance | The reported performance from questions of the node |
Data fields for a child
Field | Description |
---|---|
aggrChildPerformance | The aggrPerformanceNode of child (The weighted performance of the child) This will be summed with all other children to make the nodePerformance for the node |
childPerformance | The nodePerformance of the child |
aggrTrDue | The number targets due for this node and child |
aggrDueTrAchived | The number of targets that have been achieved given that they are due for the child |
aggrTrNotDue | The number of targets not due for the child |
aggTrValueNode | The number of targets achieved even if not due |
reportedPerformance | The reported performance from questions of that child |
Data fields for questions
Field | Description |
---|---|
target | The target for this question |
actual | The recorded result for this question |
audit | The audited result for this question |
percent | The percent difference between the actual and the target |
notDue | True if the target is not due and False otherwise |
trValue | Boolean representation of whether target is met. So if percent = 100% then 1 else 0 |
Quarterly performance dashboard
This dashboard displays programme level data (i.e. data at level 1 of the hierarchy). This data has been aggregated up from the capture level, which is the leaf level (For DALRRD this is level 4). Each instance of this object is split by quarter. The data from this dashboard comes from the service db/kwantu-resource/etl/elasticSearch/drdlr/performanceDRDLR/performanceDrdlrCreateReport.xqm
. This service uses the nodeResult file at the Programme level to calculate the data.
Fields
This is a table showing each field present in the quarterly performance dashboard object and what calculation the service does on the nodeResult data if required.
Field | description | calculation |
---|---|---|
resultArea | The name of the indicator | nodeName |
quarter | The quarter the performance was captured | This is represented by "Q" + (quarter as number). For example: Q1, Q2, Q3, Q4 |
level | The level of the hierarchy | nodeLevel |
nodeName | The name of the node | nodeName |
outline | The outline of the node | nodeOutline |
sortedOutline | The outline of the node represented in a way that the grids can sort properly. | Take 1.1.1.12 for example. This would become 01010112 |
sortedNodeName | This is only used for the programme level and adds the outline in front of the node name. This is so charts can sort correctly | Take Administration with outline 1 for example. This becomes 1. Administration |
levelName | This is the level name. For example: Output indicator or Programme | levelName |
targetCount | This is the count of targets for this quarter. At the programme level this is the sum of all targets from its children | This is calculated as aggrTrDue + aggrTrNotDue |
targetsDue | The number of targets that are due for this quarter | aggrTrDue |
targetsNotDue | The number of targets that are NOT due for this quarter | aggrTrNotDue |
targetsAchievedCount | The number of targets that have been achieved for this quarter. This includes indicators that do NOT have targets | aggTrValueNode |
targetsNotAchieved | The number of targets that have NOT been achieved for this quarter. This includes indicators that do NOT have targets | Currently calculated as aggTrDenomNode - aggTrValueNode (However this is an incorrect calculation) |
percentTargetsMet | The percentage of targets that have been met (Current implementation is that given there is a target has that target been met) | This is currently calculated as aggTrValueNode / aggTrDenomNode * 100 (However this is an incorrect calculation) |
percentTargetsNotMet | The percentage of targets that have ¬NOT¬ been met (Current implementation is that given there is a target has that target been met) | This is currently calculated as 100 - aggTrValueNode / aggTrDenomNode * 100 (However this is an incorrect calculation) |
overallPerformance | This is the overall performance of this node calculated by the performance of its children. | nodePerformance |
Indicator performance dashboard
This dashboard shows data on indicator questions. This data comes from the question repeat at the capture level, which is the leaf level. (For DALRRD this is level 4). The data from this dashboard comes from the service db/kwantu-resource/etl/elasticSearch/drdlr/performanceDRDLR/performanceDrdlrCreateReport.xqm
. This service uses the nodeResult file at the Output Indicator level to calculate the data.
Calculation Scheme Explanation
There are four different variants of calculation schemes are available in the system. One can apply the scheme at the plan level, which can be overridden at the node level, which further can be overridden at the fields level while defining the questions.
The ultimate impact of the calculation scheme will reflect at the question level according to the following formulas.
Higher better
This is the default calculation scheme where the "higher value" will be counted as a better achievement. The formula for the percentage = (actual / target) * 100
Lower better
In a lower-better scheme, the better achievement will be counted when the actual value is less than or equal to the target. The formula for the percentage = 100 - ((actual / target) * 100) - 100)
Higher better Transform
The Higher-better transform scheme is available for requirements like when we want to transform the percentage in slabs. For example, if we want our achievements to be calculated like 0-50% = 0%, 50-94% = 50%, and above 95% = 100%, then we can configure the slabs with the given transformation value of percentage to the slab. The formula for the percentage = transform((actual / target) * 100)
Lower better Transform
The Lower-better transform scheme is available for requirements like when we want to transform the percentage in slabs but in a lower-better manner. For example, if we want our achievements to be calculated like 0-20% = 100%, 21-49% = 50%, and below 50% = 0%, then we can configure the slabs with the given transformation value of percentage to the slab. The formula for the percentage = transform(100 - ((actual / target) * 100) - 100))
Important to note that
- The transformed value should be in percentage.
- The slabs are calculated from top to bottom with a cut-off configuration.
Outstanding items
There are few things pending in my list, but those are not needed for DALRRD, so I will cover them gradually.
//TODO - Pending work
//calculate trColor
//transformed values as per definition (Currently it is 1 is 100% 0 otherwise, but we need to pick from UI)
//higher better lower better (Formula to be applied)
//question level colors //Question level overriding of the color scheme
//parent node level colors // Node level overriding of the color scheme
//TR aggregation function is sum by default - do we need a way to define ?