RIO Ready V4: Community Transcript Setup
Table of Contents
To quickly setup the Community Transcript functionality, please follow the following steps:
Prerequisite
- S-Docs installed and configured, for more information please refer to here. S-Docs must also be configured to run as another user, for more information refer to here.
- 00 Generic Metadata for RIO Ready V4 is selected together with the Community Transcript component during installation, or has been installed beforehand. It contains shared metadata required by the RIO Ready V4 components.
- RIO Ready V4 - Community Transcript is installed.
Setting up S-Docs
We need to setup S-Docs run as user feature, please refer to the guide linked here. If the Community Transcript component has been installed, most of the configuration should already be in place. However, some additional setup is required, as detailed below:
1. Update Remote Site Settings:
- Go to Setup, in the Quick Find box, search for Remote Site Settings.
- Click the Edit button next to SDocTranscriptDomain.
- Update the Remote Site URL with your Salesforce domain URL, then click Save.
- SDocsTranscript is set to https://test.salesforce.com by default. For a production org, click Edit next to SDocsTranscript and update the Remote Site URL to https://login.salesforce.com.
2. Create a Self-Signed Certificate:
- Go to Setup, in the Quick Find box, search for Certificate and Key Management.
-
Click on Create Self-Signed Certificate, fill in the required details as shown in the instructions, and save it.
- Name: SDocsCert
- After saving, click Download Certificate to save the certificate to your local storage.
3. Upload the Certificate to Sdocs Connected App:
- Go to Setup, in the Quick Find box, search for External Client App Manager.
- Find Sdocs Connected Apps, click the down arrow next to it and select Edit Settings.
-
Update the following settings and save:
-
OAuth Settings
- Callback URL: https://test.salesforce.com/services/oauth2/callback
- OAuth Scopes: Manage user data via APIs (api); Access Connect REST API resources (chatter_api); Perform requests at any time (refresh_token, offline_access)
-
Flow Enablement
- Enable JWT Bearer Flow: true - upload the certificate from step #2.
-
Security
- Require secret for Web Server Flow: true
- Require secret for Refresh Token Flow: true
-
OAuth Settings
- Back to the External Client App Manager, click the down arrow next to Sdocs Connected Apps and select Edit Policies.
-
Update the following policies and save:
- Start Page: None
- Select Profile: System Administrator; Customer Community Login User
-
OAuth Policies - Plugin Policies:
- Permitted Users: Admin approved users are pre-authorized.
-
OAuth Policies - App Authorization:
- Refresh Token Policy (Idle Expiration Time Limit Enforced): Expire refresh token if not used for specific time
- Refresh Token Validity Period: 30
- Refresh Token Validity Unit: Day(s)
- IP Relaxation: Enforce IP restrictions
- Click the tab “Settings” under Sdocs Connected Apps, scroll down to the OAuth Settings.
- Click the button “Consumer Key and Secret”, verification code will be sent to your email for verification purposes.
- Copy the Consumer Key to be used in the following step.
Configure Custom Settings:
- Navigate to Setup >> Custom Setting.
- Click the link “Manage” next to SDocsSettings.
-
Create a new record with the following details:
- Name: SDocsSettings
- ConnectedAppAudienceURL: [Production]: https://login.salesforce.com OR [Sandbox]: https://test.salesforce.com
- ConnectedAppCertificateName: SDocsCert
- ConnectedAppConsumerKey: [Consumer Key in step 3.7]
- ConnectedAppLoginURL: [Production]: https://login.salesforce.com OR [Sandbox]: https://test.salesforce.com
-
ConnectedAppTokenURL: [Salesforce Domain URL, can get this by clicking your user profile in the upper right corner, under your username]
- ConnectedAppUserName: Username for run as user feature. [User must have S-Docs license and admin permission]
-
Click Save.
Activating the Flow
1. Login to Salesforce and go to “Setup”.
2. From Setup, click on Home.
3. In the Quick Find box, enter Flows. Click on Flows.
4. Click on "REDU Request Transcript Screen".

5. Click on Activate.

Adding the Flow to a Digital Experience Page and Page Layout
Digital Experience
1. From Setup, in the Quick Find box, type Digital Experiences.
2. Go to All Sites, and click Builder next to the site where you want to add the flow.

3. Navigate to the page where you'd like to place the flow, or add a new page using existing template below:
- In the community builder, click the top menu and “+ New Page”
- Click “Standard Page”, then select the preconfigured page - “My Transcript” and click next.
-
Insert the Name and URL as below then create.
- Name: My Transcript
- URL: my-transcript
-
Navigate to the My Transcript page >> Properties, update the following:
- Page Access: Requires Login
- Tick the option “Override the default theme layout for this page.”. Set the Theme Layout as “Student”
4. Publish the changes to make the flow live on the site.
Salesforce Internal
1. From Setup, go to Object Manager, and select the Contact object.
2. Navigate to Page Layout, and select the layout that should display the action button.
3. In the layout editor, select Mobile & Lightning Actions, drag the "Request Transcript" action into the Salesforce Mobile and Lightning Experience Actions section, then click Save.
4. You should now see the Request Transcript button on the Contact record page.

Trigger Controller
1. From Setup, in the Quick Find box, type Custom Metadata Types.
2. Click on Manage next to the Trigger Controllers custom metadata type.
3. Look for a record named SDOC_SetContentVersion_After.
- If it exists, ensure that it is active.
-
If it does not exist, create a new record with the details provided in the image below.
Assigning Permission Sets for Student Users
Ensure that newly created students in the Community are assigned the permission set "SDocs Jobs (Guest Users)" and “SDocs LWC Community User”.

Transcript Template
1. Ensure that S-Docs is installed before creating the transcript template, as this functionality is dependent on S-Docs.
2. If S-Docs is already installed, navigate to the S-Docs app by searching for it in the App Switcher.

3. Create two new templates, and fill in the details as shown in the provided image (refer to instructions or image).
Template Name: Transcript
Template Format: PDF

Template Name: Course_List
Template Format: Component

4. Download the file Transcript_10_10_2024.txt.
5. Copy the contents of the file. Then, click on the Template Editor button located in the top right corner of the Transcript record, and paste the copied content into the Template Body section of the S-Docs template.

6. Copy the contents below. Then, click the Template Editor button located in the top right corner of the Course_List record. Next, click on the Source button and paste the copied content into the Template Body section of the S-Docs template.
Course_List Source Code
<style type="text/css">table.table208 {font-family:Arial,sans-serif; font-size:9pt;width:100%;sd:repeatheader;border-spacing:0;border-width:0;}
.table208col0{text-align:left;vertical-align:text-top;font-weight:bold;font-size:9pt;font-family:Arial,sans-serif;width:0%;white-space:nowrap;}
.table208col1{text-align:left;font-size:9pt;font-family:Arial,sans-serif;width:16%;white-space:nowrap;}
.table208col2{text-align:left;font-size:9pt;font-family:Arial,sans-serif;width:32%;white-space:nowrap;}
.table208col3{text-align:left;font-size:9pt;font-family:Arial,sans-serif;width:13%;white-space:nowrap;}
.table208col4{text-align:left;font-size:9pt;font-family:Arial,sans-serif;width:16%;white-space:nowrap;}
.table208col5{text-align:center;font-size:9pt;font-family:Arial,sans-serif;width:10%;white-space:nowrap;}
.table208col6{text-align:left;font-size:9pt;font-family:Arial,sans-serif;width:13%;white-space:nowrap;}
</style>
<table border="0" class="table208">
<tbody>
<tr>
<th width="16%"> </th>
<th width="32%"> </th>
<th width="13%"> </th>
<th width="16%"> </th>
<th width="10%"> </th>
<th width="13%"> </th>
</tr>
</tbody>
<tbody><!--{{! <LineItemsSOQL>
<class>table208</class>
<column>reduivy__Individual_Academic_Progress__r.reduivy__Academic_Term__r.Name</column>
<column>reduivy__Study_Offering__r.reduivy__Study_Unit__r.reduivy__Unit_Code__c</column>
<column>reduivy__Study_Offering__r.reduivy__Study_Unit__r.Name</column>
<column>reduivy__Credits_Attempted__c</column>
<column>reduivy__Credits_Earned__c</column>
<column>reduivy__Letter_Grade__c</column>
<column>reduivy__Grade_Points__c</column>
<soql>
SELECT reduivy__Individual_Academic_Progress__r.reduivy__Academic_Term__r.Name,
reduivy__Study_Offering__r.reduivy__Study_Unit__r.reduivy__Unit_Code__c,
reduivy__Study_Offering__r.reduivy__Study_Unit__r.Name,
reduivy__Credits_Attempted__c,
reduivy__Credits_Earned__c,
reduivy__Letter_Grade__c,
reduivy__Grade_Points__c,
reduivy__Individual_Academic_Progress__c
FROM reduivy__Individual_Enrollment__c
WHERE reduivy__Individual_Academic_Progress__c = '{{!reduivy__Individual_Academic_Progress__c.id}}'
</soql>
<groupby>reduivy__Individual_Academic_Progress__r.reduivy__Academic_Term__r.Name</groupby>
</LineItemsSOQL> }}-->
</tbody>
</table>
<!--{{!
<lineitemsSOQL>
<queryname>transferHours</queryname>
<soql>
SELECT SUM(reduivy__Credits_Earned__c) totalTransferHours FROM reduivy__Individual_Enrollment__c WHERE reduivy__Individual_Academic_Progress__c = '{{!reduivy__Individual_Academic_Progress__c.id}}' AND reduivy__Credit_Transfer_Received__c = true GROUP BY reduivy__Individual_Academic_Progress__r.reduivy__Academic_Term__c
</soql>
</lineitemsSOQL> }}--><!--{{!
<lineitemsSOQL>
<queryname>summary</queryname>
<soql>
SELECT reduivy__Credits_Attempted__c, reduivy__Credits_Earned__c, reduivy__GPA__c FROM reduivy__Individual_Academic_Progress__c WHERE Id = '{{!reduivy__Individual_Academic_Progress__c.id}}'
</soql>
</lineitemsSOQL> }}-->
<div style="font-family: Arial, sans-serif; font-size: 8pt; line-height: 1.5; font-weight: bold; text-align: center; width: 100%; margin: 0 auto;">
<table style="width: 100%; border-collapse: collapse; margin: 0 auto; font-size: 9px;">
<tbody>
<tr>
<td style="font-size: 8pt; padding: 5px 10px; border: none;"><span style="display: inline-block; margin-right: 5px;">Transfer Hours:</span> <span><!--RENDER='{{!transferHours.totalTransferHours}}'!= null-->{{!transferHours.totalTransferHours format-number="###"}}<!--ENDRENDER--><!--RENDER='{{!transferHours.totalTransferHours}}'== null-->0<!--ENDRENDER--></span></td>
<td style="font-size: 8pt; padding: 5px 10px; border: none;"><span style="display: inline-block; margin-right: 5px;">Att Hours:</span> <span><!--RENDER='{{!summary.reduivy__Credits_Attempted__c}}'!= null-->{{!summary.reduivy__Credits_Attempted__c format-number="###"}}<!--ENDRENDER--><!--RENDER='{{!summary.reduivy__Credits_Attempted__c}}'== null-->0<!--ENDRENDER--></span></td>
<td style="font-size: 8pt; padding: 5px 10px; border: none;"><span style="display: inline-block; margin-right: 5px;">Comp Hours:</span> <span><!--RENDER='{{!summary.reduivy__Credits_Earned__c}}'!= null-->{{!summary.reduivy__Credits_Earned__c format-number="###"}}<!--ENDRENDER--><!--RENDER='{{!summary.reduivy__Credits_Earned__c}}'== null-->0<!--ENDRENDER--></span></td>
<td style="font-size: 8pt; padding: 5px 10px; border: none;"><span style="display: inline-block; margin-right: 5px;">Term GPA:</span> <span><!--RENDER='{{!summary.reduivy__GPA__c}}'!= null-->{{!summary.reduivy__GPA__c format-number="#,###.##"}}<!--ENDRENDER--><!--RENDER='{{!summary.reduivy__GPA__c}}'== null-->0<!--ENDRENDER--></span></td>
</tr>
</tbody>
</table>
</div>
7. Click Save & Close to complete the setup.