National Dashboard : New Kpis for 2.8 release
We have added 3 new KPIs as per the requirement.Following are the KPIs:
Average Property Tax Collected : This represents the average tax collected by each property. This is calculated by formula- (Total property tax collected / Total number of properties paid).This KPI is added in the National Dashboard Property Tax screen on the overview card.
Total Non-Tax Collection : This is the sum of all non-tax revenue collections such as ( Trade licenses , Building plan approval , miscellaneous receipts , etc..)This KPI can be found in the National Dashboard Overview Screen on the overview card.
Total Non-Tax Revenue Contribution : This represents the percentage contribution of the total non-tax revenue over total revenue. This is calculated by the formula - (Total non-tax collected/Total revenue collected) x 100.This KPI can also be found in the National Dashboard Overview Screen on the overview card.
The Confluence files for these screens have also been updated. Please refer: Overview Document and Property Tax Document for the same.
Assumptions taken:
In each module, we cannot bifurcate the tax and nontax heads. Eg: PT tax including cess consider as one Tax head.
The average property tax paid is decided based on the number of payment transactions. If the same property is paid 2 times for different financial years, we consider these two transactions.
Tax and Non Tax includes arrears, penalty, exemption etc.
Mcollect: Here many tax heads are there. All are considered as non-tax heads.
Re-indexing is required to the existing data for "Average property tax Paid" Kpi.
Each payment is assumed separate (PT), partial payment is also considered as a single payment
Data can only be considered from today or existing national dss data should be reindexed
Mappings for new property should be considered as Long
Long or decimal - amount fields.
Build and commit for division operation required for PT avg tax KPI.
Please follow following steps for entire implementation:
Step 1: Add the config changes in the ChartApiConfig.json file in the configs repository. Newly added configs can be referred from here.
Step 2: Add the config placement in the MasterDashboardConfig.json file. Placement configs can be referred from 2 places in the file:
For National Dashboard Overview KPIs in the Overview card refer here.
For property tax KPI refer here.
Step 3: Add the newly added property: noOfPropertiesPaidToday to the PT module-fields-mapping in
the DevOps, in the respective environment file, refer here.
Updated PT fields: "PT":{"transactions":"array::number","todaysTotalApplications":"number","todaysClosedApplications":"number","assessments":"number","assessedProperties":"array::number","propertiesRegistered":"array::number","todaysCollection":"array::number","propertyTax":"array::number","cess":"array::number","rebate":"array::number","penalty":"array::number","interest":"array::number","noOfPropertiesPaidToday":"number"}
Step 4: Update the index mapping in Kibana as follows:
PUT pt-national-dashboard/_mapping/nss
{
"properties" : {
"assessedPropertiesForUsageCategory" : {
"type" : "long"
},
"assessments" : {
"type" : "long"
},
"cessForUsageCategory" : {
"type" : "long"
},
"createdBy" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"createdTime" : {
"type" : "long"
},
"date" : {
"type" : "date",
"format" : "dd-MM-yyyy HH:mm:ss||dd-MM-yyyy||epoch_millis||dd-MM-yyyy'T'HH:mm:ss.SSSZ"
},
"financialYear" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"interestForUsageCategory" : {
"type" : "long"
},
"lastModifiedBy" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"lastModifiedTime" : {
"type" : "long"
}
"module" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"noOfPropertiesPaidToday" : {
"type" : "long"
},
"penaltyForUsageCategory" : {
"type" : "long"
},
"propertiesRegisteredForFinancialYear" : {
"type" : "long"
},
"propertyTaxForUsageCategory" : {
"type" : "long"
},
"rebateForUsageCategory" : {
"type" : "long"
},
"region" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
"ignore_above" : 256
}
}
},
"state" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"taxCollections" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"todaysClosedApplications" : {
"type" : "long"
},
"todaysCollectionForNonTaxCollections" : {
"type" : "long"
},
"todaysCollectionForTaxCollections" : {
"type" : "long"
},
"todaysCollectionForUsageCategory" : {
"type" : "long"
},
"todaysTotalApplications" : {
"type" : "long"
},
"totalApplicationsPaidTheTax" : {
"type" : "long"
},
"transactionsForUsageCategory" : {
"type" : "long"
},
"ulb" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"usageCategory" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"ward" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
Step 5: Re-indexing pt-national-dashboard
Step 6: You will require a Code level change in dashboard-analytics as well to implement the
“division” logic. Please add the change as listed here. Also, refer to this file for adding
constants. Following is the build: dashboard-analytics:v1.1.8_beta-9dabbb1f7c-107
Step 7: Upsert the localisations for the new KPIs as follows:
curl --location -g --request POST '{{url}}/localization/messages/v1/_upsert' \
--header 'Content-Type: application/json' \
--data-raw '{
"RequestInfo": {
"apiId": "emp",
"ver": "1.0",
"ts": "10-03-2017 00:00:00",
"action": "create",
"did": "1",
"key": "abcdkey",
"msgId": "20170310130900",
"requesterId": "rajesh",
"authToken": "a8dd019c-25db-4796-838a-51c31d1a4120",
"userInfo": {
"id": 128
}
},
"tenantId": "pg",
"messages": [
{
"code": "NATIONAL_PT_DSS_AVG_TAX_COLLECTION",
"message": "Average Property Tax Collected",
"module": "rainmaker-dss",
"locale": "en_IN"
},
{
"code": "TIP_NATIONAL_PT_DSS_AVG_TAX_COLLECTION",
"message": "Total property tax collected / Total number of properties",
"module": "rainmaker-dss",
"locale": "en_IN"
},
{
"code": "DSS_TOTAL_NON_TAX_COLLECTION",
"message": "Total Non-Tax Collection",
"module": "rainmaker-dss",
"locale": "en_IN"
},
{
"code": "TIP_DSS_TOTAL_NON_TAX_COLLECTION",
"message": "Sum of all non tax revenue collections such as ( Trade licenses , Building plan approval , miscellaneous receipts , etc..)",
"module": "rainmaker-dss",
"locale": "en_IN"
},
{
"code": "DSS_NON_TAX_REVENUE_CONTRIBUTION",
"message": "Non-Tax Revenue Contribution",
"module": "rainmaker-dss",
"locale": "en_IN"
},
{
"code": "TIP_DSS_NON_TAX_REVENUE_CONTRIBUTION",
"message": "(Total non-tax collected/Total revenue collected) x 100",
"module": "rainmaker-dss",
"locale": "en_IN"
}
]
}'
Step 8: Once these changes are implemented, restart the dashboard-analytics and
national-dashboard-ingest by checking the Cluster-configs.
Note: Now the data can be ingested using adapter.Step 8 is optional and should be used only for testing purpose.
Step 9(Optional Step- Only for testing purpose): Now you can upsert the new data for testing using _ingest api. The curl for the same is as follows:
curl --location --request POST 'http://localhost:8081/national-dashboard/metric/_ingest' \
--header 'Content-Type: application/json' \
--data-raw '{
"RequestInfo": {
"apiId": "asset-services",
"ver": null,
"ts": null,
"action": null,
"did": null,
"key": null,
"msgId": "search with from and to values",
"authToken": "f5f22a04-ba52-4616-9e13-734bce63a15c",
"userInfo": {
"id": 11227,
"uuid": "151cb3c7-3713-4e15-b9a1-3babd6d5e5a9",
"userName": "UATPTSU",
"name": "PT Super User",
"mobileNumber": "8990877667",
"emailId": "",
"locale": null,
"type": "EMPLOYEE",
"roles": [
{
"name": "NDA SYSTEM",
"code": "NDA_SYSTEM",
"tenantId": "pg.citya"
},
{
"name": "PT Counter Employee",
"code": "PT_CEMP",
"tenantId": "pg.citya"
},
{
"name": "Property Approver",
"code": "PROPERTY_APPROVER",
"tenantId": "pg.citya"
},
{
"name": "PT Doc Verifier",
"code": "PT_DOC_VERIFIER",
"tenantId": "pg.citya"
},
{
"name": "Property Tax Receipt Cancellator",
"code": "CR_PT",
"tenantId": "pg.citya"
},
{
"name": "PT Counter Approver",
"code": "PT_APPROVER",
"tenantId": "pg.citya"
},
{
"name": "PT Field Inspector",
"code": "PT_FIELD_INSPECTOR",
"tenantId": "pg.citya"
},
{
"name": "Property Verifier",
"code": "PROPERTY_VERIFIER",
"tenantId": "pg.citya"
}
],
"active": true,
"tenantId": "pg.citya",
"permanentCity": null
}
},
"Data": [
{
"date": "12-11-2022",
"module": "PT",
"ward": "Block 1",
"ulb": "pb.amritsar",
"region": "Amritsar-MC",
"state": "Punjab",
"metrics": {
"assessments": 29,
"todaysTotalApplications": 62,
"todaysClosedApplications": 21,
"noOfPropertiesPaidToday": 10,
"propertiesRegistered": [
{
"groupBy": "financialYear",
"buckets": [
{
"name": "2018-19",
"value": 12
},
{
"name": "2019-20",
"value": 18
},
{
"name": "2020-21",
"value": 21
}
]
}
],
"assessedProperties": [
{
"groupBy": "usageCategory",
"buckets": [
{
"name": "RESIDENTIAL",
"value": 21
},
{
"name": "COMMERCIAL",
"value": 11
},
{
"name": "INDUSTRIAL",
"value": 13
}
]
}
],
"transactions": [
{
"groupBy": "usageCategory",
"buckets": [
{
"name": "RESIDENTIAL",
"value": 19
},
{
"name": "COMMERCIAL",
"value": 13
},
{
"name": "INDUSTRIAL",
"value": 13
}
]
}
],
"todaysCollection": [
{
"groupBy": "usageCategory",
"buckets": [
{
"name": "RESIDENTIAL",
"value": 16000
},
{
"name": "COMMERCIAL",
"value": 22500
},
{
"name": "INDUSTRIAL",
"value": 26000
}
]
}
],
"propertyTax": [
{
"groupBy": "usageCategory",
"buckets": [
{
"name": "RESIDENTIAL",
"value": 1200
},
{
"name": "COMMERCIAL",
"value": 2100
},
{
"name": "INDUSTRIAL",
"value": 100
}
]
}
],
"cess": [
{
"groupBy": "usageCategory",
"buckets": [
{
"name": "RESIDENTIAL",
"value": 1300
},
{
"name": "COMMERCIAL",
"value": 1900
},
{
"name": "INDUSTRIAL",
"value": 1000
}
]
}
],
"rebate": [
{
"groupBy": "usageCategory",
"buckets": [
{
"name": "RESIDENTIAL",
"value": -500
},
{
"name": "COMMERCIAL",
"value": -1200
},
{
"name": "INDUSTRIAL",
"value": -900
}
]
}
],
"penalty": [
{
"groupBy": "usageCategory",
"buckets": [
{
"name": "RESIDENTIAL",
"value": 1300
},
{
"name": "COMMERCIAL",
"value": 1500
},
{
"name": "INDUSTRIAL",
"value": 1500
}
]
}
],
"interest": [
{
"groupBy": "usageCategory",
"buckets": [
{
"name": "RESIDENTIAL",
"value": 1900
},
{
"name": "COMMERCIAL",
"value": 1800
},
{
"name": "INDUSTRIAL",
"value": 600
}
]
}
]
}
}
]
}'