Wiki source code of ISMS Data Quality

Last modified by Lee Pedley on 2026/09/21 21:59

Hide last authors
Lee Pedley 1.1 1 {{velocity}}
2 #set($issues=[])
3 #set($riskDocs=$services.query.xwql("from doc.object('Risks.Code.RisksClass') as obj").setLimit(2000).execute())
4 #foreach($ref in $riskDocs)#set($d=$xwiki.getDocument($ref))#set($o=$d.getObject('Risks.Code.RisksClass'))#if($o)#if(!$o.getProperty('owner').getValue())#set($x=$issues.add(['Risk',$ref,$d.displayTitle,'Missing owner']))#end#if(!$o.getProperty('likelihood').getValue() || !$o.getProperty('impact').getValue())#set($x=$issues.add(['Risk',$ref,$d.displayTitle,'Inherent assessment incomplete']))#end#if(!$o.getProperty('treatmentDecision').getValue())#set($x=$issues.add(['Risk',$ref,$d.displayTitle,'Treatment decision missing']))#end#end#end
5 #set($controlDocs=$services.query.xwql("from doc.object('Controls and SoA.Code.Controls and SoAClass') as obj").setLimit(2000).execute())
6 #foreach($ref in $controlDocs)#set($d=$xwiki.getDocument($ref))#set($o=$d.getObject('Controls and SoA.Code.Controls and SoAClass'))#if($o)#if(!$o.getProperty('controlReference').getValue())#set($x=$issues.add(['Control',$ref,$d.displayTitle,'Control reference missing']))#end#if(!$o.getProperty('applicable').getValue())#set($x=$issues.add(['Control',$ref,$d.displayTitle,'Applicability not decided']))#end#if($o.getProperty('applicable').getValue()=='No' && !$o.getProperty('applicabilityJustification').getValue())#set($x=$issues.add(['Control',$ref,$d.displayTitle,'Not-applicable justification missing']))#end#if(!$o.getProperty('implementationStatus').getValue())#set($x=$issues.add(['Control',$ref,$d.displayTitle,'Implementation status missing']))#end#end#end
7 #set($treatmentDocs=$services.query.xwql("from doc.object('Risk Treatments.Code.Risk TreatmentsClass') as obj").setLimit(2000).execute())
8 #foreach($ref in $treatmentDocs)#set($d=$xwiki.getDocument($ref))#set($o=$d.getObject('Risk Treatments.Code.Risk TreatmentsClass'))#if($o)#if(!$o.getProperty('relatedRisk').getValue())#set($x=$issues.add(['Treatment',$ref,$d.displayTitle,'Related risk missing']))#end#if(!$o.getProperty('owner').getValue())#set($x=$issues.add(['Treatment',$ref,$d.displayTitle,'Owner missing']))#end#end#end
9 #set($evidenceDocs=$services.query.xwql("from doc.object('Evidence.Code.EvidenceClass') as obj").setLimit(2000).execute())
10 #foreach($ref in $evidenceDocs)#set($d=$xwiki.getDocument($ref))#set($o=$d.getObject('Evidence.Code.EvidenceClass'))#if($o)#if(!$o.getProperty('owner').getValue())#set($x=$issues.add(['Evidence',$ref,$d.displayTitle,'Owner missing']))#end#if(!$o.getProperty('relatedControls').getValue() && !$o.getProperty('relatedRisks').getValue())#set($x=$issues.add(['Evidence',$ref,$d.displayTitle,'Not linked to a control or risk']))#end#end#end
11 #set($auditDocs=$services.query.xwql("from doc.object('Audits.Code.AuditsClass') as obj").setLimit(2000).execute())
12 #foreach($ref in $auditDocs)#set($d=$xwiki.getDocument($ref))#set($o=$d.getObject('Audits.Code.AuditsClass'))#if($o)#if(!$o.getProperty('leadAuditor').getValue())#set($x=$issues.add(['Audit',$ref,$d.displayTitle,'Lead auditor missing']))#end#if(!$o.getProperty('scope').getValue())#set($x=$issues.add(['Audit',$ref,$d.displayTitle,'Scope missing']))#end#end#end
13 #set($findingDocs=$services.query.xwql("from doc.object('Findings.Code.FindingsClass') as obj").setLimit(2000).execute())
14 #foreach($ref in $findingDocs)#set($d=$xwiki.getDocument($ref))#set($o=$d.getObject('Findings.Code.FindingsClass'))#if($o)#if(!$o.getProperty('relatedAudit').getValue())#set($x=$issues.add(['Finding',$ref,$d.displayTitle,'Related audit missing']))#end#if(!$o.getProperty('owner').getValue())#set($x=$issues.add(['Finding',$ref,$d.displayTitle,'Owner missing']))#end#end#end
15 #set($actionDocs=$services.query.xwql("from doc.object('Corrective Actions.Code.Corrective ActionsClass') as obj").setLimit(2000).execute())
16 #foreach($ref in $actionDocs)#set($d=$xwiki.getDocument($ref))#set($o=$d.getObject('Corrective Actions.Code.Corrective ActionsClass'))#if($o)#if(!$o.getProperty('relatedFinding').getValue())#set($x=$issues.add(['Corrective Action',$ref,$d.displayTitle,'Related finding missing']))#end#if(!$o.getProperty('owner').getValue())#set($x=$issues.add(['Corrective Action',$ref,$d.displayTitle,'Owner missing']))#end#end#end
17 {{html wiki="true" clean="false"}}
18 <style>.dq-table{border-collapse:collapse;width:100%}.dq-table th,.dq-table td{border-bottom:1px solid #dfe4e8;padding:8px;text-align:left}</style>
19 <div class="box infomessage"><strong>Data quality check</strong><br/>This page checks practical completeness of core ISMS records. It is a management aid, not a certification assessment.</div>
20 #if($issues.isEmpty())<div class="box successmessage">No configured data-quality issues were detected.</div>#else<p><strong>$issues.size()</strong> issue(s) detected.</p><table class="dq-table"><thead><tr><th>Register</th><th>Record</th><th>Issue</th></tr></thead><tbody>#foreach($i in $issues)<tr><td>$escapetool.xml($i.get(0))</td><td><a href="$xwiki.getURL($i.get(1),'view')">$escapetool.xml($i.get(2))</a></td><td>$escapetool.xml($i.get(3))</td></tr>#end</tbody></table>#end
21 {{/html}}
22 {{/velocity}}