Customization of report to get certifier name

Which IIQ version are you inquiring about?

Version 8.1

Please share any images or screenshots, if relevant.

Share all details related to your problem, including any error messages you may have received.

We want certifier name in the report column tab for Entitlement Owner Access Review Live Report.
present it does not have a option we want to add the certifier name so before the reports we can check the certifier name.

Hi @akhil_chidurala,

Welcome back to SailPoint Developer community.

Can you add below line in your Columns tag from debug and run it once to see if you are getting your expected outcome.

<ReportColumnConfig field="certifier" header="Certifier" property="parent.certification.Certifiers" width="110"/>

Thanks

Hi @ashutosh08 ,

I have added the given column in the 75th which i have attached below the XML.
We are getting errors in the reports.

<?xml version='1.0' encoding='UTF-8'?> import sailpoint.object.*; import sailpoint.api.ObjectUtil; if (value != null){ return ObjectUtil.convertIdsToNames(context, Application.class, value); } return null; if(value instanceof sailpoint.object.EntitlementSnapshot){ return sailpoint.api.EntitlementDescriber.summarize(value); } return ""; return sailpoint.reporting.ReportingLibrary.getColumnValue(context, sailpoint.object.Identity.class, value, "firstname"); return sailpoint.reporting.ReportingLibrary.getColumnValue(context, sailpoint.object.Identity.class, value, "lastname");
                        return sailpoint.reporting.ReportingLibrary.getColumnValue(context, sailpoint.object.Identity.class, value, "manager.name");
                      
                    </Source>
            </RenderScript>
          </ReportColumnConfig>
          <ReportColumnConfig field="certName" header="rept_data_owner_col_cert_access_review" property="parent.certification.name" sortable="true" width="110"/>
          <ReportColumnConfig field="certGroupName" header="rept_data_owner_col_cert_grp_name" property="parent.certification.certificationGroups.name" sortable="true" width="110"/>
          <ReportColumnConfig field="tags" header="rept_cert_col_tags" property="parent.certification.tags.name" subQueryKey="id" width="110"/>
          <ReportColumnConfig field="certifier" header="Certifier" property="parent.certification.Certifiers" width="110"/>
          <ReportColumnConfig field="status" header="rept_cert_col_status" property="summaryStatus" sortable="true" width="110"/>
          <ReportColumnConfig field="decision" header="rept_cert_col_decision" property="action.status" sortable="true" width="110"/>
          <ReportColumnConfig field="remediationCompleted" header="rept_cert_col_revoke_completed" property="action" width="110">
            <RenderScript>
              <Source>
                      import sailpoint.reporting.ReportingLibrary;
                      import sailpoint.tools.Util;
                      import java.lang.String;
                      String status = ReportingLibrary.getRemediationStatus(context, value);
                      return Util.isNullOrEmpty(status) ? "" : status;
                    </Source>
            </RenderScript>
          </ReportColumnConfig>
          <ReportColumnConfig field="decisionMaker" header="rept_cert_col_decision_maker" property="action.actorName" sortable="true" width="110"/>
          <ReportColumnConfig field="comments" header="rept_cert_col_decision_maker_comments" property="action" width="110">
            <RenderScript>
              <Source>
                            return value != null ? value.getComments() : null;
                        </Source>
            </RenderScript>
          </ReportColumnConfig>
          <ReportColumnConfig field="exclusionExplanation" header="rept_cert_col_exclusion_explanation" property="parent" width="110">
            <RenderScript>
              <Source>
                      
                      if (value != null){
                        if (value instanceof sailpoint.object.ArchivedCertificationEntity) {
                          return value.getExplanation();
                        }
                      }
                      
                    </Source>
            </RenderScript>
          </ReportColumnConfig>
        </Columns>
        <InitializationRule>
          <Reference class="sailpoint.object.Rule" id="0aff6d04773a1f1381773acfa190020a" name="Certification Report Customizer"/>
        </InitializationRule>
        <ReportSummary title="rept_cert_summary_title">
          <DataSourceScript>
            <Source>
                    
                    import java.util.*;
                    import sailpoint.object.*;

                    QueryOptions ops = baseQueryOptions;

                    List fields = new ArrayList();
                    fields.add("count(*)");
                    fields.add("count(distinct parent.id)");
                    fields.add("count(distinct parent.certification.id)");
                    fields.add("count(distinct parent.certification.certificationGroups.id)");

                    Iterator iter = context.search(CertificationItem.class, ops, fields);

                    Map map = new HashMap();

                    if (iter.hasNext()){
                      Object[] results = iter.next();
                      map.put("certifications", results[3]);
                      map.put("accessReviews", results[2]);
                      map.put("entitlements", results[1]);
                      map.put("items", results[0]);
                    }

                    return map;
                    
                  </Source>
          </DataSourceScript>
          <Values>
            <LiveReportSummaryValue label="reprt_cert_summary_total_certs" name="certifications"/>
            <LiveReportSummaryValue label="reprt_cert_summary_total_access_reviews" name="accessReviews"/>
            <LiveReportSummaryValue label="reprt_cert_summary_total_entitlements" name="entitlements"/>
            <LiveReportSummaryValue label="reprt_cert_summary_total_items" name="items"/>
          </Values>
        </ReportSummary>
      </LiveReport>
    </value>
  </entry>
</Map>
Displays information about the entitlement owner certifications in detailed format. rept_input_account_grp_cert_report_apps rept_input_cert_report_create_dt rept_input_cert_report_signed_date rept_input_cert_report_exp_dt rept_input_cert_report_tags

sailpoint.tools.GeneralException: Error preparing ProjectionDataSource
at sailpoint.reporting.JasperCsvWriter.write(JasperCsvWriter.java:139)
at sailpoint.reporting.LiveReportExecutor.execute(LiveReportExecutor.java:228)
at sailpoint.api.TaskManager.runSync(TaskManager.java:903)
at sailpoint.api.TaskManager.runSync(TaskManager.java:723)
at sailpoint.scheduler.JobAdapter.execute(JobAdapter.java:128)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: net.sf.jasperreports.engine.JRException: Error preparing ProjectionDataSource
at sailpoint.reporting.datasource.BaseProjectionDataSource.next(BaseProjectionDataSource.java:206)
at sailpoint.reporting.datasource.CertificationLiveReportDataSource.next(CertificationLiveReportDataSource.java:237)
at sailpoint.reporting.JasperCsvWriter.write(JasperCsvWriter.java:103)
… 6 more
Caused by: sailpoint.tools.GeneralException: could not resolve property: Certifiers of: sailpoint.object.Certification
at sailpoint.persistence.HibernatePersistenceManager.search(HibernatePersistenceManager.java:2106)
at sailpoint.persistence.ClassPersistenceManager.search(ClassPersistenceManager.java:334)
at sailpoint.server.InternalContext.search(InternalContext.java:880)
at sailpoint.reporting.datasource.ProjectionDataSource.prepare(ProjectionDataSource.java:56)
at sailpoint.reporting.datasource.BaseProjectionDataSource.next(BaseProjectionDataSource.java:203)
… 8 more
Caused by: org.hibernate.QueryException: could not resolve property: Certifiers of: sailpoint.object.Certification
at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:73)
at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:67)
at org.hibernate.persister.entity.AbstractEntityPersister.getPropertyType(AbstractEntityPersister.java:4775)
at sailpoint.persistence.HQLAliasContextImpl.getPropertyInfo(HQLAliasContextImpl.java:214)
at sailpoint.persistence.HQLAliasContextImpl.parseProperty(HQLAliasContextImpl.java:242)
at sailpoint.persistence.HQLAliasContextImpl.substituteAlias(HQLAliasContextImpl.java:117)
at sailpoint.persistence.HQLAliasContextStack.substituteAlias(HQLAliasContextStack.java:101)
at sailpoint.persistence.HQLFilterVisitor.addSelectColumns(HQLFilterVisitor.java:577)
at sailpoint.persistence.HQLFilterVisitor.getQueryString(HQLFilterVisitor.java:511)
at sailpoint.persistence.HibernatePersistenceManager.search(HibernatePersistenceManager.java:2088)
… 12 more

Hi @akhil_chidurala,

Try below snippet. This should work. Please check for null pointer exception for some corner case.

 <ReportColumnConfig field="certifier" header="Certifier" property="parent.certification" width="110">
                <RenderScript>
                  <Source>
                    				import sailpoint.tools.Util;
                    				
                            if(value instanceof sailpoint.object.Certification){
                       
                    						
                    						return Util.listToCsv(value.getCertifiers());
                            }
                            return "";
                        </Source>
                </RenderScript>
              </ReportColumnConfig>

Let me know if you still face issue.

Thanks

Can you try adding this one .

<ReportColumnConfig field="decisionMaker" header="rept_cert_col_decision_maker" property="action.actorName" sortable="true" width="110">

              <RenderScript>
                  <Source>

                    import sailpoint.object.Identity;
                    import sailpoint.api.SailPointContext;

                    if(value!=null){
                    Identity identity = context.getObjectByName(Identity.class,value);
                    return identity.getDisplayName();
                    }

                  </Source>
                </RenderScript>
              </ReportColumnConfig>

Hi @ashutosh08 ,

This worked for me thanks for the help.

1 Like

Hi @vishal_kejriwal1 ,

We want the certifier name before the decision was made. I have tested this it is not working for me. We are getting after the certifier signed off we are getting the value.

Thanks.

Feel free to mark the solution so that later on it can be directly accessed by someone.

Thanks

can you advise how to get the roleAccountName field from Target review certificate to be added in the report

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.