Assess Property
Overview
The Property Assessment configuration guide explains how to configure and set up the necessary MDMS configurations, persister mappings, and workflow integrations required to create, update, and manage assessments. It also covers how assessments interact with downstream components like the PT Calculator and Billing Service, and how citizens are kept informed through workflow-driven notifications.
Key Functionalities
The Assessment of Property feature allows the system to:
Create, update, and search assessments associated with a property.
Serve as the basis for tax calculation and demand generation.
Capture a snapshot of property characteristics for a given financial year.
Only operate on properties that are already registered in the system.
Configuration Steps
Configure MDMS
Shared Configs
Assessment largely inherits configs from the Property Tax module, so start by including the PropertyTax MDMS templates from the repository here.
Assessment-Specific MDMS Settings
assessment id format
PB-AS-[cy:yyyy-MM-dd]-[SEQ_EG_PT_ASSM]
Format for generating unique IDs for assessments
kafka create assessment topic
save-pt-assessment
Kafka topic for new assessment events
kafka update assessment topic
update-pt-assessment
Kafka topic for assessment updates
assessment.workflow.enabled
true/false
Enable workflow for assessments
assessment.workflow.trigger.param
usageCategory,occupancyType,occupancyDate
Fields that trigger workflow when changed
Configure Persister
Assessment data is stored and updated through the Persister service.
Add the assessment-persister.yml config to your Persister configs.
serviceMaps:
serviceName: property-services
mappings:
- version: 1.0
description: Persists assessment details to eg_pt_asmt_assessment table
fromTopic: save-pt-assessment
isTransaction: true
queryMaps:
- query: INSERT INTO eg_pt_asmt_assessment(id, tenantid, assessmentnumber, financialyear, propertyid, status, source, channel, assessmentdate, additionaldetails, createdby, createdtime, lastmodifiedby, lastmodifiedtime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
basePath: Assessment
jsonMaps:
- jsonPath: $.Assessment.id
- jsonPath: $.Assessment.tenantId
- jsonPath: $.Assessment.assessmentNumber
- jsonPath: $.Assessment.financialYear
- jsonPath: $.Assessment.propertyId
- jsonPath: $.Assessment.status
- jsonPath: $.Assessment.source
- jsonPath: $.Assessment.channel
- jsonPath: $.Assessment.assessmentDate
- jsonPath: $.Assessment.additionalDetails
type: JSON
dbType: JSONB
- jsonPath: $.Assessment.auditDetails.createdBy
- jsonPath: $.Assessment.auditDetails.createdTime
- jsonPath: $.Assessment.auditDetails.lastModifiedBy
- jsonPath: $.Assessment.auditDetails.lastModifiedTime
- query: INSERT INTO eg_pt_asmt_unitusage (tenantid, id, assessmentid, unitid, usagecategory, occupancytype, occupancydate, active, createdby, createdtime, lastmodifiedby, lastmodifiedtime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
basePath: Assessment.unitUsageList.*
jsonMaps:
- jsonPath: $.Assessment.unitUsageList.*.tenantId
- jsonPath: $.Assessment.unitUsageList.*.id
- jsonPath: $.Assessment[?({id} in @.unitUsageList[*].id)].id
- jsonPath: $.Assessment.unitUsageList.*.unitId
- jsonPath: $.Assessment.unitUsageList.*.usageCategory
- jsonPath: $.Assessment.unitUsageList.*.occupancyType
- jsonPath: $.Assessment.unitUsageList.*.occupancyDate
- jsonPath: $.Assessment.unitUsageList.*.active
- jsonPath: $.Assessment.unitUsageList.*.auditDetails.createdBy
- jsonPath: $.Assessment.unitUsageList.*.auditDetails.createdTime
- jsonPath: $.Assessment.unitUsageList.*.auditDetails.lastModifiedBy
- jsonPath: $.Assessment.unitUsageList.*.auditDetails.lastModifiedTime
- query: INSERT INTO eg_pt_asmt_document (id, tenantid, entityid, documenttype, filestoreid, documentuid, status, createdby, lastmodifiedby, createdtime, lastmodifiedtime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?);
basePath: $.Assessment.documents.*
jsonMaps:
- jsonPath: $.Assessment.documents.*.id
- jsonPath: $.Assessment.tenantId
- jsonPath: $.Assessment.id
- jsonPath: $.Assessment.documents.*.documentType
- jsonPath: $.Assessment.documents.*.fileStoreId
- jsonPath: $.Assessment.documents.*.documentUid
- jsonPath: $.Assessment.documents.*.status
- jsonPath: $.Assessment.documents.*.auditDetails.createdBy
- jsonPath: $.Assessment.documents.*.auditDetails.lastModifiedBy
- jsonPath: $.Assessment.documents.*.auditDetails.createdTime
- jsonPath: $.Assessment.documents.*.auditDetails.lastModifiedTime
- version: 1.0
description: Updates assessment details to eg_pt_asmt_assessment table
fromTopic: update-pt-assessment
isTransaction: true
queryMaps:
- query: INSERT INTO eg_pt_asmt_assessment_audit SELECT *, (SELECT extract(epoch from now())) FROM eg_pt_asmt_assessment WHERE id = ?;
basePath: Assessment
jsonMaps:
- jsonPath: $.Assessment.id
- query: INSERT INTO eg_pt_asmt_unitusage_audit SELECT *, (SELECT extract(epoch from now())) FROM eg_pt_asmt_unitusage WHERE id = ?;
basePath: Assessment.unitUsageList.*
jsonMaps:
- jsonPath: $.Assessment.unitUsageList.*.id
- query: UPDATE eg_pt_asmt_assessment SET financialyear = ?, status = ?, source = ?, assessmentDate = ?, additionaldetails = ?, lastmodifiedby = ?, lastmodifiedtime = ? WHERE id = ?;
basePath: Assessment
jsonMaps:
- jsonPath: $.Assessment.financialYear
- jsonPath: $.Assessment.status
- jsonPath: $.Assessment.source
- jsonPath: $.Assessment.assessmentDate
- jsonPath: $.Assessment.additionalDetails
type: JSON
dbType: JSONB
- jsonPath: $.Assessment.auditDetails.lastModifiedBy
- jsonPath: $.Assessment.auditDetails.lastModifiedTime
- jsonPath: $.Assessment.id
- query: INSERT INTO eg_pt_asmt_unitusage (tenantid, id, assessmentId, unitid, usageCategory, occupancyType, occupancyDate, active, createdby, createdtime, lastmodifiedby, lastmodifiedtime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT (id) DO UPDATE SET usageCategory = ?, occupancyType = ?, occupancyDate = ?, active = ?, lastmodifiedby = ?, lastmodifiedtime = ?;
basePath: Assessment.unitUsageList.*
jsonMaps:
- jsonPath: $.Assessment.unitUsageList.*.tenantId
- jsonPath: $.Assessment.unitUsageList.*.id
- jsonPath: $.Assessment[?({id} in @.unitUsageList[*].id)].id
- jsonPath: $.Assessment.unitUsageList.*.unitId
- jsonPath: $.Assessment.unitUsageList.*.usageCategory
- jsonPath: $.Assessment.unitUsageList.*.occupancyType
- jsonPath: $.Assessment.unitUsageList.*.occupancyDate
- jsonPath: $.Assessment.unitUsageList.*.active
- jsonPath: $.Assessment.unitUsageList.*.auditDetails.createdBy
- jsonPath: $.Assessment.unitUsageList.*.auditDetails.createdTime
- jsonPath: $.Assessment.unitUsageList.*.auditDetails.lastModifiedBy
- jsonPath: $.Assessment.unitUsageList.*.auditDetails.lastModifiedTime
- jsonPath: $.Assessment.unitUsageList.*.usageCategory
- jsonPath: $.Assessment.unitUsageList.*.occupancyType
- jsonPath: $.Assessment.unitUsageList.*.occupancyDate
- jsonPath: $.Assessment.unitUsageList.*.active
- jsonPath: $.Assessment.unitUsageList.*.auditDetails.lastModifiedBy
- jsonPath: $.Assessment.unitUsageList.*.auditDetails.lastModifiedTime
- query: INSERT INTO eg_pt_asmt_document (id, tenantid, entityid, documenttype, filestoreid, documentuid, status, createdby, lastmodifiedby, createdtime, lastmodifiedtime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT (id) DO UPDATE documenttype = ?, documentuid = ?, status = ?, lastmodifiedby = ?, lastmodifiedtime = ?;
basePath: $.Assessment.documents.*
jsonMaps:
- jsonPath: $.Assessment.documents.*.id
- jsonPath: $.Assessment.tenantId
- jsonPath: $.Assessment.id
- jsonPath: $.Assessment.documents.*.documentType
- jsonPath: $.Assessment.documents.*.fileStoreId
- jsonPath: $.Assessment.documents.*.documentUid
- jsonPath: $.Assessment.documents.*.status
- jsonPath: $.Assessment.documents.*.auditDetails.createdBy
- jsonPath: $.Assessment.documents.*.auditDetails.lastModifiedBy
- jsonPath: $.Assessment.documents.*.auditDetails.createdTime
- jsonPath: $.Assessment.documents.*.auditDetails.lastModifiedTime
- jsonPath: $.Assessment.documents.*.documentType
- jsonPath: $.Assessment.documents.*.documentUid
- jsonPath: $.Assessment.documents.*.status
- jsonPath: $.Assessment.documents.*.auditDetails.lastModifiedBy
- jsonPath: $.Assessment.documents.*.auditDetails.lastModifiedTime
It specifies SQL mappings for tables such as:
eg_pt_asmt_assessmenteg_pt_asmt_unitusageeg_pt_asmt_document
These mappings ensure assessment data and related unit usage/documents are persisted correctly.
Configure Workflow
To handle assessment processes via workflow:
Enable assessment workflow via
assessment.workflow.enabledflag.Create a corresponding businessService definition for assessments:
Use /egov-workflow-v2/egov-wf/businessservice/_create API.
Typically, the businessService is named something like
"ASMT"(example in MDMS).
This enables statuses like INITIATED → APPLIED → APPROVED to be managed with actions like APPLY, FORWARD, REJECT, etc.
Below is a sample businessService create API body for the Assessment workflow:
{
"RequestInfo": {
"apiId": "Rainmaker",
"action": "",
"did": 1,
"key": "",
"msgId": "20170310130900|en_IN",
"requesterId": "",
"ts": 1513579888683,
"ver": ".01",
"authToken": "b39181b1-5c6b-484a-b825-6be2f62012b8"
},
"BusinessServices": [
{
"tenantId": "pb",
"businessService": "ASMT",
"business": "pt-services",
"businessServiceSla": 172800000,
"states": [
{
"sla": null,
"state": null,
"applicationStatus": null,
"docUploadRequired": false,
"isStartState": true,
"isTerminateState": false,
"isStateUpdatable": true,
"actions": [
{
"action": "INITIATE",
"nextState": "INITIATED",
"roles": [
"CITIZEN",
"PT_CEMP"
]
}
]
},
{
"sla": null,
"state": "INITIATED",
"applicationStatus": "INITIATED",
"docUploadRequired": false,
"isStartState": true,
"isTerminateState": false,
"actions": [
{
"action": "APPLY",
"nextState": "APPLIED",
"roles": [
"CITIZEN",
"PT_CEMP"
]
},
{
"action": "INITIATE",
"nextState": "INITIATED",
"roles": [
"CITIZEN",
"PT_CEMP"
]
}
]
},
{
"sla": null,
"state": "APPLIED",
"applicationStatus": "APPLIED",
"docUploadRequired": false,
"isStartState": false,
"isTerminateState": false,
"isStateUpdatable": true,
"actions": [
{
"action": "FORWARD",
"nextState": "FIELDINSPECTION",
"roles": [
"PT_DOC_VERIFIER"
]
},
{
"action": "REJECT",
"nextState": "REJECTED",
"roles": [
"PT_DOC_VERIFIER"
]
},
{
"action" : "SENDBACKTOCITIZEN",
"nextState" : "INITIATED",
"roles":["PT_DOC_VERIFIER"]
}
]
},
{
"sla": null,
"state": "REJECTED",
"applicationStatus": "REJECTED",
"isStateUpdatable": false,
"docUploadRequired": false,
"isStartState": false,
"isTerminateState": true
},
{
"sla": 86400000,
"state": "FIELDINSPECTION",
"applicationStatus": "FIELDINSPECTION",
"docUploadRequired": false,
"isStartState": false,
"isStateUpdatable": true,
"isTerminateState": false,
"actions": [
{
"action": "FORWARD",
"nextState": "PENDINGAPPROVAL",
"roles": [
"PT_FIELD_INSPECTOR"
]
},
{
"action": "REJECT",
"nextState": "REJECTED",
"roles": [
"PT_FIELD_INSPECTOR"
]
},
{
"action": "SENDBACK",
"nextState": "APPLIED",
"roles": [
"PT_FIELD_INSPECTOR"
]
}
]
},
{
"sla": 43200000,
"state": "PENDINGAPPROVAL",
"applicationStatus": "PENDINGAPPROVAL",
"docUploadRequired": false,
"isStartState": false,
"isStateUpdatable": false,
"isTerminateState": false,
"actions": [
{
"action": "APPROVE",
"nextState": "PENDINGPAYMENT",
"roles": [
"PT_APPROVER"
]
},
{
"action": "REJECT",
"nextState": "REJECTED",
"roles": [
"PT_APPROVER"
]
},
{
"action": "SENDBACK",
"nextState": "FIELDINSPECTION",
"roles": [
"PT_APPROVER"
]
}
]
},
{
"sla": 43200000,
"state": "PENDINGPAYMENT",
"applicationStatus": "PENDINGPAYMENT",
"docUploadRequired": false,
"isStartState": false,
"isTerminateState": false,
"isStateUpdatable": false,
"actions": [
{
"action": "PAY",
"nextState": "APPROVED",
"roles": [
"CITIZEN",
"PT_CEMP",
"SYSTEM_PAYMENT"
]
},
{
"action": "ADHOC",
"nextState": "PENDINGPAYMENT",
"roles": [
"PT_CEMP"
]
}
]
},
{
"sla": null,
"state": "APPROVED",
"applicationStatus": "APPROVED",
"isStateUpdatable": false,
"docUploadRequired": false,
"isStartState": false,
"isTerminateState": true
}
]
}
]
} Setup Notifications
Notifications help notify citizens about assessment progress:
Define notification messages and templates in the rainmaker-pt locale module.
Use message codes such as:
ASMT_CREATE– When a new assessment is createdASMT_UPDATE– When an assessment is updatedASMT_APPROVED– When an assessment is approved
For additional statuses, prefix with
ASMT_and for messages useASMT_MSG_.
Sample payment notification:
{
"code": "PT_NOTIFICATION_PAYMENT_FAIL",
"message": "Dear Citizen, Your payment of Rs. <insert amount to pay> for Property Tax Unique ID <insert ID> has failed. Your assessment is pending. Please try again. Ignore this message if you have completed your payment. You can pay your Property Tax online here - <payLink>",
"module": "rainmaker-pt",
"locale": "en_IN"
},
{
"code": "PT_NOTIFICATION_PAYMENT_OFFILE",
"message": "Dear Citizen, Your Property Tax payment of Rs. <amount> has been accepted. Mode of Payment: <insert mode of payment> Pending Amount: <Enter pending amount>.",
"module": "rainmaker-pt",
"locale": "en_IN"
},
{
"code": "PT_NOTIFICATION_PAYMENT_ONLINE",
"message": "Dear Citizen, Your payment of Rs.< insert amount paid> with payment transaction id < insert payment transaction id from PG> has been made successfully. Assessment for Property Tax Unique ID <insert Property Tax Assessment ID> was succesful. Property Tax due is Rs.<pt due>.",
"module": "rainmaker-pt",
"locale": "en_IN"
},
{
"code": "PT_NOTIFICATION_PAYMENT_PARTIAL_OFFLINE",
"message": "Dear Citizen, Your Property Tax payment of Rs. <amount> has been accepted. Mode of Payment: <insert mode of payment> Pending Amount: <Enter pending amount>. You can pay your Property Tax online here - <payLink>",
"module": "rainmaker-pt",
"locale": "en_IN"
},
{
"code": "PT_NOTIFICATION_PAYMENT_PARTIAL_ONLINE",
"message": "Dear Citizen, Your payment of Rs.< insert amount paid> with payment transaction id < insert payment transaction id from PG> has been made successfully. Assessment for Property Tax Unique ID <insert ID> was succesful. Property Tax due is Rs.<pt due>. You can pay your Property Tax here - <payLink>",
"module": "rainmaker-pt",
"locale": "en_IN"
}Sample Assessment notification:
{
"code": "ASMT_APPLIED",
"message": "Applied",
"module": "rainmaker-pt",
"locale": "en_IN"
},
{
"code": "ASMT_APPROVED",
"message": "Approved",
"module": "rainmaker-pt",
"locale": "en_IN"
},
{
"code": "ASMT_CREATE",
"message": "Dear {OWNER_NAME}, Your assessment with {ASSESSMENTNUMBER} for financial year {FINANCIALYEAR} and property id {PROPERTYID} is created.",
"module": "rainmaker-pt",
"locale": "en_IN"
},
{
"code": "ASMT_UPDATE",
"message": "Dear {OWNER_NAME}, Your assessment with {ASSESSMENTNUMBER} for financial year {FINANCIALYEAR} and property id {PROPERTYID} is reassessed.",
"module": "rainmaker-pt",
"locale": "en_IN"
},
{
"code": "ASMT_MSG_APPLIED",
"message": "Dear {OWNER_NAME}, Your assessment with {ASSESSMENTNUMBER} for financial year {FINANCIALYEAR} and property id {PROPERTYID} is updated to {STATUS}.",
"module": "rainmaker-pt",
"locale": "en_IN"
},
{
"code": "ASMT_MSG_APPROVED",
"message": "Dear {OWNER_NAME}, Your assessment with {ASSESSMENTNUMBER} for financial year {FINANCIALYEAR} and property id {PROPERTYID} is {STATUS}.",
"module": "rainmaker-pt",
"locale": "en_IN"
}References
Refer to the property document Property Services | Doc-Links
API LIST
/assessment/_create
/assessment/_update
/assessment/_search
Last updated
Was this helpful?