Skip to content

Instantly share code, notes, and snippets.

@aaronwinters
Created June 10, 2022 19:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save aaronwinters/50d6e35a09b4e6b106de97c4bc9139e2 to your computer and use it in GitHub Desktop.
Save aaronwinters/50d6e35a09b4e6b106de97c4bc9139e2 to your computer and use it in GitHub Desktop.
Snowfakery recipe for the Student Success Hub (formerly known as Adivsor Link)
# Snowfakery recipe for the Student Success Hub (formerly known as Adivsor Link)
# Creates data for the following objects:
# Contact
# Case (Advising Record)
# Case Team Role
# Case Team Member
# Case Comment
# Account (University Department)
# Advising Pool
# Queue Waiting Room Resource
# Appointment Location
# Availability
# Availability Location
# Availability Topic
# User Topic Setting
# Role Topic Setting
# Queue Topic Setting
# Appointment
# Appointment Attendee
# Success Plan Template
# Success Plan Task Template
# Success Plan
# Success Plan Task
# Task
# Alert
# Prediction
# Run this to generate data in a scratch org:
# cci task run snowfakery --recipe snowfakery_samples/EDA/eda_student_success_hub.yml --org dev
# Run this to generate records in an output JSON file (NOTE: update the org_name to the CCI org you are using)
# snowfakery ./snowfakery_samples/EDA/eda_student_success_hub.yml --output-format=json --output-file=snowfakery_samples/temp/output.json --plugin-option org_name dev
# Load plugin for querying Salesforce, used to link records to internal advisor user
- plugin: snowfakery.standard_plugins.Salesforce.SalesforceQuery
# Create Contact', 'dependency for Case (Advising)
- object: Contact
fields:
LastName:
fake: LastName
FirstName:
fake: FirstName
MailingStreet:
fake.text:
max_nb_chars: 100
MailingCity:
fake: city
MailingState:
fake: state
MailingPostalCode:
fake: postalcode
MailingCountry: "United States"
Phone:
fake: phone_number
MobilePhone:
fake: phone_number
HomePhone:
fake: phone_number
hed__PreferredPhone__c: "Mobile Phone"
Email:
fake: Email
LeadSource:
random_choice:
- Web
- Phone Inquiry
- Partner Referral
- Purchased List
- Other
Birthdate:
date_between:
start_date: -50y
end_date: -18y
Description:
fake.text:
max_nb_chars: 100
friends:
# Set primary department
- object: hed__Affiliation__c
fields:
hed__Account__c:
reference: SampleAcademicDepartment
hed__Contact__c:
reference: Contact
hed__Primary__c: "True"
hed__Description__c:
fake: catch_phrase
hed__StartDate__c:
date_between:
start_date: -1y
end_date: today
hed__EndDate__c:
date_between:
start_date: today
end_date: +1y
hed__Role__c: "Student"
# Create Case (Advising) record', 'dependency for Appointment, Appointment Attendee, Alert, Prediction, Success Plan, Task
- object: Case
nickname: SampleAdvisingCase
fields:
ContactId:
reference: Contact
Subject: ${{fake.Text(max_nb_chars=80)}}
Description: ${{fake.Paragraph(nb_sentences=3)}}
# sfal__IsAdviseeRecord__c: true #field is not editable by system admins
hed__Category__c: "Other"
sfal__AdvisingPool__c:
reference: AdvisingPool
sfal__Location__c: "Other"
hed__Location__c: "Other"
friends:
- object: CaseTeamRole
fields:
AccessLevel: Edit
# CaseTeamRoles must be unique so random number is added to allow recipe to run multiple times in same org
Name: Advisor ${{random_number(min=5, max=20)}}
PreferencesVisibleInCSP: true
friends:
- object: CaseTeamMember
fields:
MemberId:
SalesforceQuery.find_record:
from: User
where: UserType='Standard'
ParentId:
reference: SampleAdvisingCase
TeamRoleId:
reference: CaseTeamRole
- object: CaseComment
count: 3
fields:
ParentId:
reference: SampleAdvisingCase
CommentBody: ${{fake.Text(max_nb_chars=200)}}
# Create University Department
- object: Account
nickname: SampleAcademicDepartment
fields:
name: Sample Academic Department
RecordType: "University_Department"
# Create Advising Pool', 'dependency for Queue Topic Setting
- object: sfal__AdvisingPool__c
nickname: AdvisingPool
fields:
sfal__Account__c:
reference: SampleAcademicDepartment
sfal__Description__c: ${{fake.Text(max_nb_chars=200)}}
friends:
# Create Queue Waiting Room Resource
- object: sfal__QueueWaitingRoomResource__c
fields:
sfal__AdvisingPool__c:
reference: AdvisingPool
sfal__SortOrder__c: 1
sfal__User__c:
SalesforceQuery.find_record:
from: User
where: UserType='Standard'
# Objects nested with Topic
- object: sfal__Topic__c
nickname: SampleTopic
fields:
Name:
random_choice:
- Transcripts
- Grades
- Program Questions
sfal__SortOrder__c: 1
sfal__Label__c: ${{SampleTopic.Name}}
friends:
- object: sfal__UserTopicSetting__c # create User Topic Setting associated with the Topic
fields:
sfal__DefaultAppointmentDuration__c: 30
sfal__Topic__c:
reference: sfal__Topic__c
sfal__User__c:
SalesforceQuery.find_record:
from: User
where: UserType='Standard'
- object: sfal__RoleTopicSetting__c
fields:
sfal__RoleName__c:
random_choice:
- Course Advisor
- Program Advisor
- Student Services
sfal__Topic__c:
reference: sfal__Topic__c
- object: sfal__QueueTopicSetting__c
fields:
sfal__AdvisingPool__c:
reference: AdvisingPool
sfal__Topic__c:
reference: sfal__Topic__c
# Appointment Location object is dependency for Availability Location and Appointment
- object: sfal__AppointmentLocation__c
nickname: SampleAppointmentLocation
fields:
sfal__AdditionalDetails__c: ${{fake.Paragraph(nb_sentences=5)}}
sfal__Building__c: ${{fake.Text(max_nb_chars=20)}}
sfal__Campus__c: ${{fake.Text(max_nb_chars=20)}}
sfal__MeetingLink__c: ${{fake.SafeDomainName}}
sfal__Phone__c: ${{fake.PhoneNumber}}
sfal__Room__c: ${{fake.Text(max_nb_chars=12)}}
sfal__SortOrder__c: 1
sfal__Type__c: ${{fake.Text(max_nb_chars=12)}}
# Objects nested with Availability
- object: sfal__Availability__c
fields:
name: "Available Slot"
sfal__AppointmentType__c:
random_choice:
- Phone
- In-person
- Video Call
sfal__AttendeeLimit__c:
random_number:
min: 2
max: 5
friends:
- object: sfal__AvailabilityLocation__c
fields:
sfal__Availability__c:
reference: sfal__Availability__c
sfal__Location__c:
reference: SampleAppointmentLocation
- object: sfal__AvailabilityTopic__c
fields:
sfal__Availability__c:
reference: sfal__Availability__c
sfal__Topic__c:
reference: SampleTopic
# Objects nested with Appointment
- object: sfal__Appointment__c
nickname: SampleAppointment
fields:
Name: ${{fake.Sentence(nb_words=5)}}
sfal__AppointmentLocation__c:
reference: SampleAppointmentLocation
sfal__AdditionalConnectionInformation__c: ${{fake.Sentence(nb_words=10)}}
sfal__AttendeeLimit__c: 3
sfal__Description__c: ${{fake.Paragraph(nb_sentences=2)}}
sfal__StartDateTime__c: ${{fake.date_between(start_date='-10d',end_date='today')}}T${{fake.time}}Z
sfal__EndDateTime__c: ${{fake.date_between(start_date='today',end_date='+1w')}}T${{fake.time}}Z
sfal__IsDiscoverable__c: true
sfal__IsWebMeeting__c: true
sfal__Location__c: ${{fake.Text(max_nb_chars=100)}}
sfal__RelatedCase__c:
reference: SampleAdvisingCase
sfal__RelatedTopic__c:
reference: SampleTopic
sfal__Topic__c: ${{fake.Word}}
sfal__WebMeetingLink__c: ${{fake.Url}}
sfal__Type__c: "Scheduled"
friends:
- object: sfal__AppointmentAttendee__c
fields:
sfal__AdviseeRecord__c:
reference: SampleAdvisingCase
sfal__Appointment__c:
reference: SampleAppointment
sfal__Comments__c: ${{fake.Text(max_nb_chars=200)}}
sfal__Role__c: "Organizer"
sfal__Status__c:
random_choice:
- Attending
- Cancelled
- No Show
- Checked In
sfal__StatusComments__c: ${{fake.Text(max_nb_chars=50)}}
# Objects nested with Success Plan Template
- object: sfal__SuccessPlanTemplate__c
count: 3
nickname: SuccessPlanTemplate
fields:
Name: ${{fake.RandomElement(elements=('Failed Assessment', 'Lack of Academic Activity', 'New Course Enrollment'))}}
sfal__Active__c: true
sfal__Comments__c: ${{fake.Text(max_nb_chars=200)}}
sfal__UsageCount__c: 1
friends:
- object: sfal__SuccessPlanTemplateTask__c
nickname: TemplateTask1
fields:
Name: Call Student
sfal__Active__c: true
sfal__Comments__c: ${{fake.Text(max_nb_chars=200)}}
sfal__Priority__c: ${{fake.RandomElement(elements=('High', 'Medium', 'Low'))}}
sfal__RelativeDueDate__c: 2
sfal__SuccessPlanTemplate__c:
reference: SuccessPlanTemplate
sfal__Type__c: Call
- object: sfal__SuccessPlanTemplateTask__c
nickname: TemplateTask2
fields:
Name: Meet with Student
sfal__Active__c: true
sfal__Comments__c: ${{fake.Text(max_nb_chars=200)}}
sfal__Priority__c: ${{fake.RandomElement(elements=('High', 'Medium', 'Low'))}}
sfal__RelativeDueDate__c: 5
sfal__SuccessPlanTemplate__c:
reference: SuccessPlanTemplate
sfal__Type__c: Meeting
- object: sfal__SuccessPlan__c
fields:
Name: ${{SuccessPlanTemplate.Name}}
sfal__AdviseeRecord__c:
reference: SampleAdvisingCase
sfal__Advisee__c:
reference: Contact
sfal__AutoApply__c: true
sfal__Comments__c: ${{SuccessPlanTemplate.sfal__Comments__c}}
sfal__FromTemplate__c:
reference: SuccessPlanTemplate
sfal__IsCancelled__c: false
sfal__IsPublished__c: true
sfal__Status__c:
random_choice: ${{fake.RandomElement(elements=('Open', 'Completed'))}}
sfal__NumberOfTasks__c: 2
sfal__NumberOfOpenTasks__c: 2
sfal__NumberOfOverdueTasks__c: 0
friends:
- object: Task
nickname: Task1
fields:
WhatId:
reference: sfal__SuccessPlan__c
OwnerId:
SalesforceQuery.find_record:
from: User
where: UserType='Standard'
Subject: ${{TemplateTask1.Name}}
ActivityDate:
date_between:
start_date: today
end_date: +2d
Description: ${{TemplateTask1.sfal__Comments__c}}
# Uncomment the type field if using a build flow or persistent org that grants running user access to this field
#Type: ${{TemplateTask1.sfal__Type__c}}
Priority: ${{TemplateTask1.sfal__Priority__c}}
- object: Task
nickname: Task2
fields:
WhatId:
reference: sfal__SuccessPlan__c
OwnerId:
SalesforceQuery.find_record:
from: User
where: UserType='Standard'
Subject: ${{TemplateTask2.Name}}
ActivityDate:
date_between:
start_date: today
end_date: +5d
Description: ${{TemplateTask2.sfal__Comments__c}}
# Uncomment the type field if using a build flow or persistent org that grants running user access to this field
#Type: ${{TemplateTask2.sfal__Type__c}}
Priority: ${{TemplateTask2.sfal__Priority__c}}
# Alert and Prediction objects
- object: sfal__Alert__c
count: 3
fields:
sfal__AdviseeRecord__c:
reference: SampleAdvisingCase
sfal__Advisee__c:
reference: Contact
sfal__AssignUsingRules__c: true
sfal__Comments__c: ${{fake.Text(max_nb_chars=200)}}
sfal__Priority__c: ${{fake.RandomElement(elements=('Urgent', 'Normal', 'Low'))}}
sfal__Reason__c: ${{fake.RandomElement(elements=('Grade Concern', 'Failure Concern', 'Missing/Late Assignment', 'Attendance Concern', 'Participation Concern', 'Preparedness Concern', 'Academic Integrity', 'Recognition', 'Missing/Late Application', 'Qualification Not Met', 'General Health', 'Room Change'))}}
sfal__Status__c:
random_choice:
- New
- "Acknowledged: In Progress"
- "Acknowledged: Redirected"
friends:
- object: sfal__Prediction__c
fields:
sfal__Alert__c:
reference: sfal__Alert__c
sfal__Appointment__c:
reference: SampleAppointment
sfal__Case__c:
reference: SampleAdvisingCase
sfal__Model__c: ${{fake.Text(max_nb_chars=20)}}
sfal__Type__c: ${{fake.Text(max_nb_chars=20)}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment