Technical Articles
Extending SAP SuccessFactors: Creating an Access Card using SuccessFactors, Pixel Perfect Talent Card (PPTC) and Business Intelligence Reporting Tool (BIRT)
Creating solutions for customers is always the fun part of being a Techie. SAP are providing both customers and partners with the tools required to build out their own Intelligent Enterprise. In this blog post, we use features within SuccessFactors and a flexible reporting tool called Business Intelligence Reporting Tool, which is more commonly known as BIRT Reporting.
Customer Request:
Recently we had a customer request: to design and print a License card containing the Equipment an employee is licensed to operate, along with the expiry date for each license. Employment Information would need to be easily displayed on the card, including a photo.
Investigation and Acknowledgment:
Design:
Using Employee Profile, PPTC, and BIRT, we were able to create a custom-sized card, small enough to fit in an employee’s top pocket or attached to a lanyard.
License and Expiry Date are to be stored in the Employee Profile. A License portlet was created with the required fields used in the card. PPTC consumes the data from the portlet to generate the license card. Updates made to the license portlet are automatically updated when creating a new PPTC. The new PPTC is created from the Employee Profile.
Implement:
Here are the implementations steps to create the solution. We start by enabling settings in Provisioning and permission the features needed to configure the solution.
1. Enable the below settings in Provisioning:
- BI Publisher Scorecard Integration
- BI Publisher Export Scorecard XML
- Export Scorecard Xml with additional Information
2. Enable the below permissions in Role Based Permissions:
- Pixel Perfect Talent Card
- Pixel Perfect Talent Card Publishing Tab Access
- Pixel Perfect Talent Card Template(s)for the required template.
- Pixel Perfect Talent Card Export XML, to publish XML output of the talent card.
Note: The PPTC Section selected should contain all the fields you want available in your PPTC/Report.
For more information and a list of sections available, click the SAP Help Portal link: https://help.sap.com/viewer/deb510367ec844b4bc84b8c52442f5e5/2111/en-US/31d710acda5d40a3bb2b6213da7902e3.html
4. Generate the PPTC XML
Navigate to the Employee Profile. Click the Actions button -> Create Talent Card
5. Use the dropdown to select the xml Template and click Create.
6. The xml file is downloaded to your local machine. The xml will be used to create the report/license card.
7. In this example, BIRT Report Designer was used.
Note: If you already have Eclipse IDE installed on your machine – that works well!
BIRT Report Designer is a 3rd party application and was used for the PPTC design.
BIRT Report Designer can be downloaded from the Eclipse Foundation website using the link below. Version 4.3.2 worked perfectly for me.
https://download.eclipse.org/birt/downloads/drops/
8. The downloaded xml in BIRT Report Designer is selected as the Data Source. The layout, data sets and field mappings are created.
9. Once the report is complete, the RPTDESIGN file is imported into Provisioning.
Template Name: The name when generating the card in SuccessFactors
Template Type: BIRT Template
File to Import: File created from BIRT (RPTDESIGN file)
Output Format: Card format in SuccessFactors
Click Import
10. Your report has been uploaded and can be created in SuccessFactors. Navigate to the Employee Profile. Click the Actions button -> Create Talent Card and Select the Template Name
11. The License card is displayed and can be printed.
It was a great solution for our customer and felt super excited to show the ability to extend SuccessFactors. Leveraging existing features and system capability – almost an Intelligent Enterprise solution! 😊
Thanks for reading,
Ashlin
Hi Ashlin,
Thanks a lot for sharing such a good article. Can you please help me a way out to automate this for the below requirement?
Our client wanted ID card to be generated and available for employees to download. The process outlined above, does it support auto generation or bulk generation of such talent cards?
Hi Guru Mohan,
Please refer to the below guide for information on batch publishing:
https://help.sap.com/doc/c50ed10bb4f14c2c9007c427041dcfc6/2111/en-US/SF_ANA_Report_Center_User.pdf
I hope this helps!
Regards
Ashlin
Great blog Ashlin!
Nice Blog! Could you please share steps for adding profile picture in PPTC.
Hi Ajay,
Make sure your xml file used in BIRT contains the <photo> <photo-blob>.
You can then create an image in your layout and map the <photo-blob>
Regards
Ashlin
Hi Ashlin
Would you be able to share your XML & row mapping for the photo-blob field? I have inserted a dynamic image & mapped to he photo-blob field but when I generate the talent card I get the message "the resource of this report item is not reachable".
Thanks,
Kim
Hello Ashlin,
Thanks for sharing such a great blog.
I need your help with the dynamic image which I have mapped to the image palette. As the data source is in the xml format when I export it from SuccessFactors the <photo><photo-blob> contains the field which is encoded in the base64 format i.e. String data type not a BLOB data type. So whenever I try to map it directly with the image palette it shows "the resource of this report item is not reachable". I have tried different ways to decode the image in Eclipse and it worked as well and it is visible in the Eclipse view report as "HTML " or "PDF" preview. But, whenever I upload the same in the SuccessFactors the image shows up as blank. Kindly help me with this issue as I have tried all the possible ways to do the same.
Thanks and regards,
Prince Dwivedi.
Hi Prince Dwivedi,
Thanks for the review!
Can you copy the below OnCreate script - Click on the Image, and then insert the code below using the script tab.
try
{
importPackage(Packages.sun.misc);
//importPackage(java.io.ByteArrayInputStream);
decoder = new BASE64Decoder();
decodedBytes = decoder.decodeBuffer(this.getRowData().getColumnValue("photo-blob"));
this.data = decodedBytes;
bais = new java.io.ByteArrayInputStream( decodedBytes);
bufimg = javax.imageio.ImageIO.read(bais);
}
catch ( e)
{
}
Regards
Ashlin
Hello Ashlin,
Thanks for your reply!
This script worked for me. Thank you so much for sharing this wonderful article.
Thanks and regards,
Prince Rajesh Dwivedi.
Hi Ashlin,
Thank you for sharing this helpful article. I am new to PPTC and there is already an existing working PPTC in the system. I have tried adding a Position Information block in the PPTC section, however, after downloading the xml file in Employee Profile, the position information is not showing in XML but it shows in the PPTC section in Employee Profile. May I ask if I missed anything? Can you kindly help me?
Thank you in advance!
Best Regards,
Angela
Hi Angela,
Can you refer to Step 3,
Navigate to Admin Center -> Configure People Profile -> General Settings -> Selected PPTC Section
Make sure your block is selected correctly.
Hope this helps!
Ash
Hi Ashlin,
Thank you for the blog, quick question regarding the photo-blob.
I am able to pull the image in eclipse, however, when I am generating the PPTC in successfactros
the system shows : The resource of this report item is not reachable.
I found the below code in a guide which is the one I am using.
<image id="24">
<property name="height">144px</property>
<property name="width">108px</property>
<property name="dataSet">Photo</property>
<list-property name="boundDataColumns">
<structure>
<property name="name">photo-blob</property>
<expression name="expression" type="javascript">dataSetRow["photo-blob"]</expression>
<property name="dataType">string</property>
</structure>
<structure>
<property name="name">PictureBlob</property>
<expression name="expression" type="javascript">org.apache.commons.codec.binary.Base64.decodeBase64(row["photo-blob"])</expression>
<property name="dataType">blob</property>
<property name="allowExport">true</property>
</structure>
</list-property>
<property name="source">expr</property>
<expression name="valueExpr">row["PictureBlob"]</expression>
</image>
Could you please advice?
p.s: I have already tried the code you sent some comments before
{
importPackage(Packages.sun.misc);
//importPackage(java.io.ByteArrayInputStream);
decoder = new BASE64Decoder();
decodedBytes = decoder.decodeBuffer(this.getRowData().getColumnValue("photo-blob"));
this.data = decodedBytes;
bais = new java.io.ByteArrayInputStream( decodedBytes);
bufimg = javax.imageio.ImageIO.read(bais);
}
catch ( e)
{
}
but when I use it I am getting the below error