To maintain an accurate asset inventory, the system must differentiate between:
assets assigned to a user in the database, and
assets that are physically in the user’s possession.
To achieve this, users must be provided with an interface where they can view their assigned hardware and digitally acknowledge ownership by confirming or rejecting possession.
The implementation introduces a user acknowledgement workflow using a custom module, automated synchronization, and a dashboard widget.
1. Custom Data Repository
A Custom Module acts as the single source of truth, storing:
Asset Name
Serial Number
Service Tag
Model details
Associated user email
User acknowledgement status
2. Automated Synchronization
A scheduled background process:
identifies assets assigned to users
populates the custom module automatically
keeps asset data continuously updated
3. Contextual Visibility
An external HTML widget is embedded within the user dashboard. The widget:
detects the logged-in user
filters and displays only assets assigned to that user
4. Direct Validation
Users can respond directly through the widget by selecting:
Yes – Asset confirmed
No – Asset rejected
The response updates the custom module in real time, completing the validation cycle between system records and physical possession.
Create a Custom Module with the required asset fields.
Use the following query to retrieve assets assigned to users:
select MAX(AaaContactInfo.EMAILID) as "Email",
MAX(aaaUser.FIRST_NAME) as "Asset Owner",
MAX(workstation.WORKSTATIONNAME) as "Asset Name",
MAX(workstation.SERVICETAG) as "Service Tag",
MAX(resource.SERIALNO) as "Org Serial Number",
MAX(workstation.MODEL) as "Model",
MAX(productType.COMPONENTTYPENAME) as "Product Type"
from SystemInfo workstation
left join Resources resource on workstation.WORKSTATIONID = resource.RESOURCEID
left join ComponentDefinition product on resource.COMPONENTID = product.COMPONENTID
left join ComponentType productType on product.COMPONENTTYPEID = productType.COMPONENTTYPEID
left join ResourceOwner rOwner on resource.RESOURCEID = rOwner.RESOURCEID
left join ResourceAssociation rToAsset on rOwner.RESOURCEOWNERID = rToAsset.RESOURCEOWNERID
left join SDUser sdUser on rOwner.USERID = sdUser.USERID
left join AaaUser aaaUser on sdUser.USERID = aaaUser.USER_ID
left join AaaUserContactInfo on aaaUser.USER_ID = AaaUserContactInfo.USER_ID
left join AaaContactInfo on AaaUserContactInfo.CONTACTINFO_ID = AaaContactInfo.CONTACTINFO_ID
where aaaUser.USER_ID is not null
and (workstation.workstationname, aaauser.first_name)
not in (
select asset_name, user_name
from cmasset_acceptance
)
group by workstation.WORKSTATIONID;
Note: Modify field names according to your instance configuration.
Update the Asset Acknowledgement Query
select MAX(AaaContactInfo.EMAILID) as "Email",
MAX(aaaUser.FIRST_NAME) as "Asset Owner",
MAX(workstation.WORKSTATIONNAME) as "Asset Name",
MAX(workstation.SERVICETAG) as "Service Tag",
MAX(resource.SERIALNO) as "Org Serial Number",
MAX(workstation.MODEL) as "Model",
MAX(productType.COMPONENTTYPENAME) as "Product Type"
from SystemInfo workstation
left join Resources resource on workstation.WORKSTATIONID = resource.RESOURCEID
left join ComponentDefinition product on resource.COMPONENTID = product.COMPONENTID
left join ComponentType productType on product.COMPONENTTYPEID = productType.COMPONENTTYPEID
left join ResourceOwner rOwner on resource.RESOURCEID = rOwner.RESOURCEID
left join ResourceAssociation rToAsset on rOwner.RESOURCEOWNERID = rToAsset.RESOURCEOWNERID
left join SDUser sdUser on rOwner.USERID = sdUser.USERID
left join AaaUser aaaUser on sdUser.USERID = aaaUser.USER_ID
left join AaaUserContactInfo on aaaUser.USER_ID = AaaUserContactInfo.USER_ID
left join AaaContactInfo on AaaUserContactInfo.CONTACTINFO_ID = AaaContactInfo.CONTACTINFO_ID
where aaaUser.USER_ID is not null
and (workstation.workstationname, aaauser.first_name)
not in (
select udf_char2, udf_char3
from cm_asset_acceptance
)
group by workstation.WORKSTATIONID;
Navigate to: Admin → Custom Schedule Functions → New
Copy content from: addAssetAcceptanceEntry_CSF.txt
Update the report name inside the script.
Save the function.
Create a schedule to run daily.
Pass the Query Report as a parameter.
Navigate to: Admin → Callback Custom Functions → New
Paste content from: CBF_fetchAssets.txt
Publish the function.
Copy the generated Callback URL.
This URL will be used inside the dashboard widget.
Open Asset_Acknowledgement.html.
Update the following variable: callbackURL
Paste the copied Callback Custom Function URL.
Configure this HTML file as an External Dashboard Widget.
Once configured:
Users see only their assigned assets list in the widget.
Users confirm or reject asset possession.
Responses update the Custom Module instantly.
IT inventory reflects real-world asset ownership accurately.