• Medhanie Habte 37
  • NEWBIE
  • 70 Points
  • Member since 2016

  • Chatter
    Feed
  • 0
    Best Answers
  • 1
    Likes Received
  • 0
    Likes Given
  • 15
    Questions
  • 30
    Replies
Greetings, I am wondering if there is a way to include two or more fields in an outputPanel tag, as shown below. My output is accounting for two fields, one within the object and the other in a related object (which is a child to the record), I get this message Unknown property 'VisualforceArrayList.Support_a_salad_bar__c'​ when I save. 
 
<messaging:emailTemplate subject="Test" recipientType="Contact" relatedToType="Contact">
<messaging:htmlEmailBody >
<apex:repeat value="{!relatedTo.Member_Schools_Serviced__r}" var="lineItem">
<apex:outputPanel rendered="{!lineItem.Term__c = '2017-2018'&& lineItem.School_Term_Progress_Reports_del__r.Support_a_salad_bar__c = FALSE}">
{!lineItem.Name}
</apex:outputPanel>
</apex:repeat>
</messaging:htmlEmailBody>
</messaging:emailTemplate>

 
Hi everyone, I am stuck on the App Customization Superbadge. I have been attempting to create a rollup summary field for shifts taken which filters only records that have a status of completed or confirmed, however, with rollup summary fields, I can only use AND logic, not OR, thus triggering this error message when I attempt to calculate the number of available shifts against desired shifts.

Challenge Not yet complete... here's what's wrong: 
The '# of Volunteers Still Needed' field on the 'Volunteer Shift' record is not working as expected.

Is there anything I am missing?

 
Hi Everyone, I've finally moved up to step on this mighty superbadge, but seem to be stuck on step 10.

Challenge Not yet complete... here's what's wrong: 
The BoatTile component doesn't fire the plotMapMarker event when a user clicks a boat.


My Code is listed below...

PlotMapMarker Event
<aura:event type="APPLICATION" description="PlotMapMarker">
    <aura:attribute name="sObjectId" type="String"/>
    <aura:attribute name="lat" type="String"/>
    <aura:attribute name="long" type="String"/>
    <aura:attribute name="label" type="String"/>
</aura:event>

Boat Tile Component
<aura:component >

    <aura:attribute name="boat" type="Boat__c" />
    <aura:attribute name="selected" type="boolean" default="false"/>
    <aura:registerEvent name="BoatSelect" type="c:BoatSelect"/>
    <aura:registerEvent name="BoatSelected" type="c:BoatSelected"/>
    <aura:registerEvent type="c.PlotMapMarker" name="PlotMapMarker"/>


        <lightning:button onclick="{!c.onBoatClick}"
                          class="{! v.selected ? 'tile selected' : 'tile' }">
            <div style="{!'background-image:url(\'' + v.boat.Picture__c + '\')'}"
                 class="innertile">
                <div class="lower-third">
                    <h1 class="slds-truncate">{! v.boat.Contact__r.Name}</h1>
                </div>
            </div>
        </lightning:button>

</aura:component>

Would love any help.
Hi guys, now on step 9 but it appears the challenge is now asking for a ternary operator, and if/or statement in my UL list

Challenge Not yet complete... here's what's wrong: 
The FiveStarRating component's unordered list must use the ternary operator to appropriately set the value of the readonly attribute.
 
<aura:component implements="flexipage:availableForAllPageTypes">
    <ltng:require styles="{!$Resource.fivestar.rating.css}" />
    <ltng:require scripts="{!$Resource.fivestar.rating.js}"
    afterScriptsLoaded="{!c.afterScriptsLoaded}" />
	<aura:attribute name="value" type="Integer" default="0"/>
    <aura:attribute name="readOnly" type="boolean"/>
       <aura:handler name="change" value="{!v.value}" action="{!c.onValueChange}"/>
	<ul aura:id="ratingarea">
    
    </ul>
</aura:component>

 
Hi All, I'm slowly but surely moving forward with this superbadge, but seem to be stuck on Step 8....

Challenge Not yet complete... here's what's wrong: 
The
FiveStarRating component doesn't have a change event listener that invokes a controller function named onValueChange. onValueChange should fire when the value attribute of the component is changed.
<aura:component implements="flexipage:availableForAllPageTypes">
	<aura:attribute name="value" type="Integer" default="0"/>
    <aura:attribute name="readOnly" type="boolean"/>
       <aura:handler name="onValueChange" value="{!v.value}" action="{!c.onValueChange}"/>
</aura:component>
 
({
	afterScriptsLoaded : function(component, event, helper) {

    // var domEl = [get dom element of rating area]
    // var currentRating = [get value attribute of component]
    // var readOnly = [get readonly attribute of component]

    var maxRating = 5;

    var callback = function(rating) {
    component.set('v.value',rating);
    }
    component.ratingObj = rating(domEl,currentRating,maxRating,callback,readOnly); 
},

onValueChange: function(component,event,helper) {
     if (component.ratingObj) {
        var value = component.get('v.value');
        component.ratingObj.setRating(value,false);
    }
}

		
	})

 
Hi everyone, I'm running into this message as I've implemented a BoatSelect class and looking to identify what may be missing in my js file.

Challenge Not yet complete... here's what's wrong: 
BoatTileController.js must have an onBoatClick function that raises the BoatSelect event, passing the Boat’s ID up to the BoatSearchResults component.
Event file
<aura:event type="COMPONENT" description="fires when a user clicks a boat on BoatSearchResults.cmp">
    <aura:attribute name="boatId" type="Id"/>
</aura:event>
JS File for BoatTileController
({
                
        onBoatClick : function(component, event, helper){
        component.set("v.selectedBoatId", event.getParam("BoatSelect"));  
        
	}
})


 
I am working on the Lightning Component Superbadge and have gotten to step 4, I however, seem to be stuck on the FormSubmit event.
I've written it like this.
 
<aura:event type="COMPONENT"> <aura:attribute name="formsubmit" type="Boat__c[]"/> </aura:event>

But get this message.
Challenge Not yet complete... here's what's wrong: The FormSubmit event isn't configured correctly. There is something missing or improperly configured in the FormSubmit.evt file.
Greetings all, I am working my way up to step 3 on the lightning component superbadge and seem to be on the BoatSeachResults apex class.

I am encountering this message, although my class is written as shown below.

Challenge Not yet complete... here's what's wrong: 
We couldn't find a
getBoats() method with the boatTypeId parameter in the BoatSearchResults Apex controller. Make sure the getBoats() method uses the string data type so that you can pass empty values to it.
 
public with sharing class BoatSearchResults {
    @AuraEnabled
    public static String getBoats(Id boatTypeId) {
        BoatType__c boat = [SELECT Id FROM BoatType__c WHERE Id = :boatTypeId];
        return string.valueOf(boat); 
    }
}

 
Greetings, I've got a Gridbuddy visualforce page embedded on accounts, but when I enable the Clickjacking protecting on Visualforce pages, the accounts page displays an error and the entire account record does not. Are there any steps I can take to allow my VF page to appear and work when clickjacking is enabled.
User-added image

My code is as below.
<apex:page standardController="Account" sidebar="false" showHeader="false">
    <GBLite:EmbedComponent baseGridUrl="{!$Page.GBLite__Grid}" />

    <iframe id="gridFrame" scrolling="auto" height="480" width="100%" frameborder="0" src="{!gridPage}gname=Moves Managed Tasks&id={!Account.Id}&sh=0&ssb=0&sbb=1&sfname=default"></iframe>
</apex:page>

 

Greetings, I've created this trigger which creates a task each time an email message is sent. Now I understand that may result in a duplicate task as email messages create tasks, but we wanted to figure a workaround that will allow creating tasks that can be populated on some custom fields and reports we have specific to a business process.

I feel good about what we have, but am wondering if there is a way to bulify the trigger by moving the SOQL query into a list, so I don't have to query within the trigger?
 

trigger EmailToTask on EmailMessage (after insert) {

    for (EmailMessage e : Trigger.new) {
       if (e.RelatedToId != NULL) {
       Task t =  new Task();
       t.ActivityDate  = date.today();
       t.Description   = e.TextBody;
       t.Move_Type__c  = 'Personal Note/Email from Donor';
       t.Priority      = 'Normal';
       t.Status        = 'Completed';
       t.Subject       = e.Subject;
       t.WhatId        = e.RelatedToId;
       t.WhoId		   = [SELECT Id FROM Contact WHERE Email = :e.ToAddress OR npe01__WorkEmail__c = :e.ToAddress OR npe01__HomeEmail__c = :e.ToAddress].Id;
       insert t;
    }
    }
    }
Greetings, 

Some of our users currently use the Compose Gmail button on contact records to send an email via Gmail which creates a completed activity in Salesforce. However, we are wondering if there is a way to automatically assign the WhatId to the contact's account record based on the WhoID being a contact. It's tricky as we're dealing with a polymorphic field, but wanted to know if there are any workarounds to address. We commonly use Account records and have built custom lookup fields for other objects such as opportunities, cases, et al, which allows us to exclusively handle records in those objects.

Hope it helps,
Greetings all,

I am setting up social sign on in a developer org to allow internal users to sign on with Google. I've opted to go with the autogenerated method, however, when I attempt to login with my Google account. I encounter a "User Not Found" Error. I have my RegHandlerClass created below. Any steps I should take?

My federation ID matches my email address if that helps.
 
//TODO:This autogenerated class includes the basics for a Registration
//Handler class. You will need to customize it to ensure it meets your needs and
//the data provided by the third party.

global class AutocreatedRegHandler1492450757085 implements Auth.RegistrationHandler{
global boolean canCreateUser(Auth.UserData data) {
  //TODO: Check whether we want to allow creation of a user with this data
  //Set<String> s = new Set<String>{'usernamea', 'usernameb', 'usernamec'};
  //if(s.contains(data.username)) {
    //return true;
  //}
  return false;
}

global User createUser(Id portalId, Auth.UserData data){
  if(!canCreateUser(data)) {
    //Returning null or throwing an exception fails the SSO flow
    return null;
  }
  //The user is authorized, so create their Salesforce user
  User u = new User();
  Profile p = [SELECT Id FROM profile WHERE name='Standard User'];
  //TODO: Customize the username. Also check that the username doesn't already exist and
  //possibly ensure there are enough org licenses to create a user. Must be 80 characters
  //or less.
  u.username = data.username + '@myorg.com';
  u.email = data.email;
  u.lastName = data.lastName;
  u.firstName = data.firstName;
  String alias = data.username;
  //Alias must be 8 characters or less
  if(alias.length() > 8) {
    alias = alias.substring(0, 8);
  }
  u.alias = alias;
  u.languagelocalekey = UserInfo.getLocale();
  u.localesidkey = UserInfo.getLocale();
  u.emailEncodingKey = 'UTF-8';
  u.timeZoneSidKey = 'America/Los_Angeles';
  u.profileId = p.Id;
  return u;
}

global void updateUser(Id userId, Id portalId, Auth.UserData data){
  User u = new User(id=userId);
  //TODO: Customize the username. Must be 80 characters or less.
  //u.username = data.username + '@myorg.com';
  u.email = data.email;
  u.lastName = data.lastName;
  u.firstName = data.firstName;
  //String alias = data.username;
  //Alias must be 8 characters or less
  //if(alias.length() > 8) {
    //alias = alias.substring(0, 8);
  //}
  //u.alias = alias;
  update(u);
}
}

 
Greetings our team recently merged a few records, and in some custom objects, we seem to be encountering some faulty flow errors, as evidenced in the debug log.
 
39.0 APEX_CODE,ERROR;APEX_PROFILING,INFO;CALLOUT,FINEST;DB,INFO;SYSTEM,DEBUG;VALIDATION,INFO;VISUALFORCE,FINER;WAVE,ERROR;WORKFLOW,ERROR
21:54:17.0 (83548)|USER_INFO|[EXTERNAL]|005XXXXXXXXX|XXXXXXXXX@XXXXX.com|Pacific Standard Time|GMT-07:00
21:54:17.0 (154735)|EXECUTION_STARTED
21:54:17.0 (161449)|CODE_UNIT_STARTED|[EXTERNAL]|Workflow:01IA0000002K1qz
21:54:17.107 (107801764)|CODE_UNIT_STARTED|[EXTERNAL]|Workflow:01IA0000002K1qz
21:54:17.308 (308389351)|FLOW_ELEMENT_ERROR|The flow tried to update these records: a0l1200000AJIt2AAH. This error occurred: ALL_OR_NONE_OPERATION_ROLLED_BACK: Record rolled back because not all records were valid and the request was using AllOrNone header. For details, see <a href='https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_calls_concepts_core_data_objects.htm#'>API Exceptions</a>.|FlowRecordUpdate|Update_Member_School_Services
21:54:17.308 (368304171)|FLOW_ELEMENT_ERROR|An error occurred when executing a flow interview.
|FlowActionCall|myRule_1_A1
21:54:17.107 (387298617)|WF_FLOW_ACTION_ERROR|09L12000000Cc3M|30012000000LKtq|Error executing flow: Sync_Member_School_Service_and_School_Term, FlowDefId: 30012000000LKtq, FlowVersionId: 30112000000LAS7
21:54:17.107 (387319418)|WF_FLOW_ACTION_ERROR_DETAIL|<b>An unhandled fault has occurred in this flow</b><br>An unhandled fault has occurred while processing the flow.  Please contact your system administrator for more information.
21:54:17.107 (387413983)|CODE_UNIT_FINISHED|Workflow:01IA0000002K1qz
21:54:17.390 (390262240)|FLOW_ELEMENT_ERROR|The flow tried to update these records: null. This error occurred: CANNOT_EXECUTE_FLOW_TRIGGER: The record couldn’t be saved because it failed to trigger a flow. A flow trigger failed to execute the flow with version ID 30112000000LAS7. Flow error messages: <b>An unhandled fault has occurred in this flow</b><br>An unhandled fault has occurred while processing the flow.  Please contact your system administrator for more information.  Contact your administrator for help.. For details, see <a href='https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_calls_concepts_core_data_objects.htm#'>API Exceptions</a>.|FlowRecordUpdate|Update_Member_School_Services
21:54:17.390 (410086409)|FLOW_ELEMENT_ERROR|An error occurred when executing a flow interview.
|FlowActionCall|myRule_1_A1
21:54:17.0 (428347702)|WF_FLOW_ACTION_ERROR|09L12000000Cc3M|30012000000LKtq|Error executing flow: Sync_Member_School_Service_and_School_Term, FlowDefId: 30012000000LKtq, FlowVersionId: 30112000000LAS7
21:54:17.0 (428369343)|WF_FLOW_ACTION_ERROR_DETAIL|<b>An unhandled fault has occurred in this flow</b><br>An unhandled fault has occurred while processing the flow.  Please contact your system administrator for more information.
21:54:17.0 (428470994)|CODE_UNIT_FINISHED|Workflow:01IA0000002K1qz
21:54:17.0 (429415510)|EXECUTION_FINISHED

Here's what the flow interview looks like.
 
Error element Update_Member_School_Services (FlowRecordUpdate).
The flow tried to update these records: null. This error occurred: CANNOT_EXECUTE_FLOW_TRIGGER: The record couldn’t be saved because it failed to trigger a flow. A flow trigger failed to execute the flow with version ID 30112000000LAS7. Flow error messages: An unhandled fault has occurred in this flow
An unhandled fault has occurred while processing the flow. Please contact your system administrator for more information. Contact your administrator for help.. For details, see API Exceptions.
This report lists the elements that the flow interview executed. The report is a beta feature.
We welcome your feedback on IdeaExchange.
Flow Details
Flow Name: Delete_Member_School_Service_Or_Term_Sync
Type: Flow
Version: 9
Status: Active
Flow Interview Details
Interview Label: Delete Member School Service Or Term Sync 2/16/2017 10:43 AM
Current User: 
Start time: 2/16/2017 10:43 AM
Duration: 4 seconds
How the Interview Started
started the flow interview.
Some of this flow's variables were set when the interview started.
DeleteMemberSchoolServiceId = a0l12000005NmudAAC
DECISION: CheckVariables
Executed this outcome: MemberSchoolServiceIdIsNotNull
Outcome conditions: and
1. {!DeleteMemberSchoolServiceId} (a0l12000005NmudAAC) Does not equal null
Logic: All conditions must be true (AND)
SCREEN: Confirm_Delete_Member
Display Text: ConfirmDeleteMessage
Value at run time: Are you sure you want to delete this Record? This will resync the At Depth field across Member School Services and the Member Names field on the School Term

Selected Navigation Button: NEXT
RECORD QUERY: LookupMemberSchoolService
Find one Member_School_Service_Term__c record where:
Id Equals {!DeleteMemberSchoolServiceId} (a0l12000005NmudAAC)
Result
Successfully found record.
{!MemberSchoolServiceToDelete.Id} = a0l12000005NmudAAC
{!MemberSchoolServiceToDelete.School_Served__c} = 0011200001K6042AAB
{!MemberSchoolServiceToDelete.Term__c} = 2016-2017
FAST LOOKUP: FindSchoolTermForFlowFromMember
Find all School_Term__c records where:
Term__c Equals {!MemberSchoolServiceToDelete.Term__c} (2016-2017)
School__c Equals {!MemberSchoolServiceToDelete.School_Served__c} (0011200001K6042AAB)
Assign those records to {!SchoolTermForFlow}.
Save these field values in the variable: Id
Result
Successfully found records.
FAST DELETE: DeleteMemberSchoolService
Delete Member_School_Service_Term__c records whose IDs are stored in {!MemberSchoolServiceToDelete}.
Variable Values
[Id=a0l12000005NmudAAC,School_Served__c=0011200001K6042AAB,Term__c=2016-2017]
Result
All records whose IDs are in {!MemberSchoolServiceToDelete} are ready to be deleted when the next Screen or Wait element is executed or when the interview finishes.
DECISION: CheckTerm
Executed this outcome: TermIsNotNull
Outcome conditions: and
1. {!SchoolTermForFlow} (a0m12000001kyO1AAI) Is null false
Logic: All conditions must be true (AND)
SUBFLOW: Run_Flow
Enter flow Sync_School_Term_and_Member_School_Service version 24.
Inputs:
SchoolTermId = {!SchoolTermForFlow.Id} (a0m12000001kyO1AAI)
DECISION: Check_Variables
Executed this outcome: SchoolTermIDIsNotNull
Outcome conditions: and
1. {!SchoolTermId} (a0m12000001kyO1AAI) Does not equal null
Logic: All conditions must be true (AND)
RECORD QUERY: Lookup_School_Term_From_ID
Find one School_Term__c record where:
Id Equals {!SchoolTermId} (a0m12000001kyO1AAI)
Result
Successfully found record.
{!SchoolTerm.At_Depth__c} = true
{!SchoolTerm.Id} = a0m12000001kyO1AAI
{!SchoolTerm.School__c} = 0011200001K6042AAB
{!SchoolTerm.Service_Member_Names__c} = Allison Villa, Paige Tester
{!SchoolTerm.Term__c} = 2016-2017
FAST LOOKUP: Find_Other_Member_School_Services
Find all Member_School_Service_Term__c records where:
Term__c Equals {!SchoolTerm.Term__c} (2016-2017)
School_Served__c Equals {!SchoolTerm.School__c} (0011200001K6042AAB)
Assign those records to {!MemberSchoolServices}.
Save these field values in the variable: Member_Term__c, School_Served__c, Term__c, At_Depth__c, Service_Member_Name__c, Id
Result
Successfully found records.
LOOP: Loop_Through_Member_School_Service
Loop Through: [a0l12000005NmuiAAC,a0l12000005NmunAAC,a0l12000005NmusAAC,a0l12000005NmuxAAC,a0l12000005Nmv2AAC,a0l1200000AJIsxAAH,a0l1200000AJIt2AAH]
Iteration: 0
Current value of {!MemberSchoolService}: a0l12000005NmuiAAC
ASSIGNMENT: Mark_At_Depth
{!MemberSchoolService.At_Depth__c} Equals {!SetAtDepth}
{!ServiceMemberNames} Equals {!AddName}
Result
{!MemberSchoolService.At_Depth__c} = "true"
{!ServiceMemberNames} = "Paige Tester"
ASSIGNMENT: Add_Member_School_Service_to_Updated_Collection
{!UpdatedMemberSchoolServices} Add {!MemberSchoolService}
Result
{!UpdatedMemberSchoolServices} = "[a0l12000005NmuiAAC]"
LOOP: Loop_Through_Member_School_Service
Loop Through: [a0l12000005NmuiAAC,a0l12000005NmunAAC,a0l12000005NmusAAC,a0l12000005NmuxAAC,a0l12000005Nmv2AAC,a0l1200000AJIsxAAH,a0l1200000AJIt2AAH]
Iteration: 1
Current value of {!MemberSchoolService}: a0l12000005NmunAAC
ASSIGNMENT: Mark_At_Depth
{!MemberSchoolService.At_Depth__c} Equals {!SetAtDepth}
{!ServiceMemberNames} Equals {!AddName}
Result
{!MemberSchoolService.At_Depth__c} = "true"
{!ServiceMemberNames} = "Paige Tester, Allison Villa"
ASSIGNMENT: Add_Member_School_Service_to_Updated_Collection
{!UpdatedMemberSchoolServices} Add {!MemberSchoolService}
Result
{!UpdatedMemberSchoolServices} = "[a0l12000005NmuiAAC,a0l12000005NmunAAC]"
LOOP: Loop_Through_Member_School_Service
Loop Through: [a0l12000005NmuiAAC,a0l12000005NmunAAC,a0l12000005NmusAAC,a0l12000005NmuxAAC,a0l12000005Nmv2AAC,a0l1200000AJIsxAAH,a0l1200000AJIt2AAH]
Iteration: 2
Current value of {!MemberSchoolService}: a0l12000005NmusAAC
ASSIGNMENT: Mark_At_Depth
{!MemberSchoolService.At_Depth__c} Equals {!SetAtDepth}
{!ServiceMemberNames} Equals {!AddName}
Result
{!MemberSchoolService.At_Depth__c} = "true"
{!ServiceMemberNames} = "Paige Tester, Allison Villa, Paige Tester"
ASSIGNMENT: Add_Member_School_Service_to_Updated_Collection
{!UpdatedMemberSchoolServices} Add {!MemberSchoolService}
Result
{!UpdatedMemberSchoolServices} = "[a0l12000005NmuiAAC,a0l12000005NmunAAC,a0l12000005NmusAAC]"
LOOP: Loop_Through_Member_School_Service
Loop Through: [a0l12000005NmuiAAC,a0l12000005NmunAAC,a0l12000005NmusAAC,a0l12000005NmuxAAC,a0l12000005Nmv2AAC,a0l1200000AJIsxAAH,a0l1200000AJIt2AAH]
Iteration: 3
Current value of {!MemberSchoolService}: a0l12000005NmuxAAC
ASSIGNMENT: Mark_At_Depth
{!MemberSchoolService.At_Depth__c} Equals {!SetAtDepth}
{!ServiceMemberNames} Equals {!AddName}
Result
{!MemberSchoolService.At_Depth__c} = "true"
{!ServiceMemberNames} = "Paige Tester, Allison Villa, Paige Tester, Allison Villa"
ASSIGNMENT: Add_Member_School_Service_to_Updated_Collection
{!UpdatedMemberSchoolServices} Add {!MemberSchoolService}
Result
{!UpdatedMemberSchoolServices} = "[a0l12000005NmuiAAC,a0l12000005NmunAAC,a0l12000005NmusAAC,a0l12000005NmuxAAC]"
LOOP: Loop_Through_Member_School_Service
Loop Through: [a0l12000005NmuiAAC,a0l12000005NmunAAC,a0l12000005NmusAAC,a0l12000005NmuxAAC,a0l12000005Nmv2AAC,a0l1200000AJIsxAAH,a0l1200000AJIt2AAH]
Iteration: 4
Current value of {!MemberSchoolService}: a0l12000005Nmv2AAC
ASSIGNMENT: Mark_At_Depth
{!MemberSchoolService.At_Depth__c} Equals {!SetAtDepth}
{!ServiceMemberNames} Equals {!AddName}
Result
{!MemberSchoolService.At_Depth__c} = "true"
{!ServiceMemberNames} = "Paige Tester, Allison Villa, Paige Tester, Allison Villa, Paige Tester"
ASSIGNMENT: Add_Member_School_Service_to_Updated_Collection
{!UpdatedMemberSchoolServices} Add {!MemberSchoolService}
Result
{!UpdatedMemberSchoolServices} = "[a0l12000005NmuiAAC,a0l12000005NmunAAC,a0l12000005NmusAAC,a0l12000005NmuxAAC,a0l12000005Nmv2AAC]"
LOOP: Loop_Through_Member_School_Service
Loop Through: [a0l12000005NmuiAAC,a0l12000005NmunAAC,a0l12000005NmusAAC,a0l12000005NmuxAAC,a0l12000005Nmv2AAC,a0l1200000AJIsxAAH,a0l1200000AJIt2AAH]
Iteration: 5
Current value of {!MemberSchoolService}: a0l1200000AJIsxAAH
ASSIGNMENT: Mark_At_Depth
{!MemberSchoolService.At_Depth__c} Equals {!SetAtDepth}
{!ServiceMemberNames} Equals {!AddName}
Result
{!MemberSchoolService.At_Depth__c} = "true"
{!ServiceMemberNames} = "Paige Tester, Allison Villa, Paige Tester, Allison Villa, Paige Tester, Paige Tester"
ASSIGNMENT: Add_Member_School_Service_to_Updated_Collection
{!UpdatedMemberSchoolServices} Add {!MemberSchoolService}
Result
{!UpdatedMemberSchoolServices} = "[a0l12000005NmuiAAC,a0l12000005NmunAAC,a0l12000005NmusAAC,a0l12000005NmuxAAC,a0l12000005Nmv2AAC,a0l1200000AJIsxAAH]"
LOOP: Loop_Through_Member_School_Service
Loop Through: [a0l12000005NmuiAAC,a0l12000005NmunAAC,a0l12000005NmusAAC,a0l12000005NmuxAAC,a0l12000005Nmv2AAC,a0l1200000AJIsxAAH,a0l1200000AJIt2AAH]
Iteration: 6
Current value of {!MemberSchoolService}: a0l1200000AJIt2AAH
ASSIGNMENT: Mark_At_Depth
{!MemberSchoolService.At_Depth__c} Equals {!SetAtDepth}
{!ServiceMemberNames} Equals {!AddName}
Result
{!MemberSchoolService.At_Depth__c} = "true"
{!ServiceMemberNames} = "Paige Tester, Allison Villa, Paige Tester, Allison Villa, Paige Tester, Paige Tester, Allison Villa"
ASSIGNMENT: Add_Member_School_Service_to_Updated_Collection
{!UpdatedMemberSchoolServices} Add {!MemberSchoolService}
Result
{!UpdatedMemberSchoolServices} = "[a0l12000005NmuiAAC,a0l12000005NmunAAC,a0l12000005NmusAAC,a0l12000005NmuxAAC,a0l12000005Nmv2AAC,a0l1200000AJIsxAAH,a0l1200000AJIt2AAH]"
LOOP: Loop_Through_Member_School_Service
End Loop.
FAST UPDATE: Update_Member_School_Services
Update Member_School_Service_Term__c records whose IDs are stored in {!UpdatedMemberSchoolServices}.
Variable Values
[Member_Term__c=a0I1200000JYvo2EAD,School_Served__c=0011200001K6042AAB,Term__c=2016-2017,At_Depth__c=true,Service_Member_Name__c=Paige Tester,Id=a0l12000005NmuiAAC]
[Member_Term__c=a0I1200000JYvnxEAD,School_Served__c=0011200001K6042AAB,Term__c=2016-2017,At_Depth__c=true,Service_Member_Name__c=Allison Villa,Id=a0l12000005NmunAAC]
[Member_Term__c=a0I1200000JYvo2EAD,School_Served__c=0011200001K6042AAB,Term__c=2016-2017,At_Depth__c=true,Service_Member_Name__c=Paige Tester,Id=a0l12000005NmusAAC]
[Member_Term__c=a0I1200000JYvnxEAD,School_Served__c=0011200001K6042AAB,Term__c=2016-2017,At_Depth__c=true,Service_Member_Name__c=Allison Villa,Id=a0l12000005NmuxAAC]
[Member_Term__c=a0I1200000JYvo2EAD,School_Served__c=0011200001K6042AAB,Term__c=2016-2017,At_Depth__c=true,Service_Member_Name__c=Paige Tester,Id=a0l12000005Nmv2AAC]
[Member_Term__c=a0I1200000JYvo2EAD,School_Served__c=0011200001K6042AAB,Term__c=2016-2017,At_Depth__c=true,Service_Member_Name__c=Paige Tester,Id=a0l1200000AJIsxAAH]
[Member_Term__c=a0I1200000JYvnxEAD,School_Served__c=0011200001K6042AAB,Term__c=2016-2017,At_Depth__c=true,Service_Member_Name__c=Allison Villa,Id=a0l1200000AJIt2AAH]
Result
Failed to update records whose IDs are in {!UpdatedMemberSchoolServices}.
Error Occurred: The flow tried to update these records: null. This error occurred: CANNOT_EXECUTE_FLOW_TRIGGER: The record couldn’t be saved because it failed to trigger a flow. A flow trigger failed to execute the flow with version ID 30112000000LAS7. Flow error messages: An unhandled fault has occurred in this flow
An unhandled fault has occurred while processing the flow. Please contact your system administrator for more information. Contact your administrator for help.. For details, see API Exceptions.

We've been trying to determine what may be causing the flow error, but are uncertain as to what the message is conveying, are there are steps we may be missing. I can provide.

Hope it helps,
Hi all, I have developed an apex class and trigger to automatically deploy echoSign agreements based on a criteria that is met in the trigger. However, it appears a web service is being called when I design the class, and implement a test class. 

The goal with this trigger is to automate the sending of agreement templates from echoSign to the contact who will sign the agreement. 
With the @future callout the trigger creates the object but does not run. However without it, it does. Needless to say without the @future callout the test class fails with the Methods defined as TestMetod do not support web service.

Are there any steps I should take.

Here's the class
public class AutoSendAdobeSign { 
    
    public static void sendAgreement(Id temId, Id mteId) { 
    try {
           System.debug('Calling AgreementTemplateService.load: ' + temid + ' - ' + mteid); 
           echosign_dev1.AgreementTemplateService.load( temid , mteid );        
    } catch (Exception E) { System.debug('Exception: ' + e.getStackTraceString());}       
    }
}

The Trigger with the specified crtieria to run
 
trigger SendMTEviaAdobeSign on Member_Term_Evaluation__c (after update) {
        //This Class Automatically Sends an Adobe Sign Agreement for the Member_Term_Evaluation Custom Object


        //For the PY17 Member Term Evaluation, this variable can be updated according to Program Year
    String templateId; 
           templateId = [SELECT Id FROM echosign_dev1__Agreement_Template__c WHERE Name = 'Evaluation' ].Id;
 {
    //Only send when the Signed By Supervisor field is checked off
            for(Member_Term_Evaluation__c mte: Trigger.new) {
                if(mte.Id != NULL && mte.Date_of_Review__c != NULL && mte.Signed_by_Supervisor__c != Trigger.oldMap.get(mte.Id).Signed_by_Supervisor__c ){
                        String masterId = mte.Id;
                        AutoSendAdobeSign.sendAgreement(templateId, masterId);
                        system.debug(mte.Service_Member__r.FirstName + ' and ' + mte.Lead_Supervisor__r.LastName + ' will be getting their member term evaluation on ' + mte.Date_of_Review__c.format() + ' .');
                }
                }
    }
}



Here is my Test Class
@isTest
private class SendMTEviaAdobeSignTest {

static testMethod void insertNewmasterId() {
     Test.startTest();

RecordType servicememberRT = [SELECT Id from RecordType WHERE sObjectType = 'Contact' AND Name = 'Service Member' LIMIT 1];

    Echosign_dev1__SIGN_Merge_Mapping__c adobemm = new Echosign_dev1__SIGN_Merge_Mapping__c();
     adobemm.Name                                = 'masterId';
     adobemm.echosign_dev1__Default__c           = FALSE;
     insert adobemm;                 

    Echosign_dev1__Agreement_Template__c adobeat = new Echosign_dev1__Agreement_Template__c();
     adobeat.Name                                   = 'PY17 Service Member Term Evaluation';
     adobeat.Echosign_dev1__Auto_Send__c            = TRUE;
     adobeat.Echosign_dev1__Name__c                 = 'Adobe Sign Agreement';
     adobeat.Echosign_dev1__Signature_Type__c       = 'e-Signature';
     adobeat.Echosign_dev1__Language__c             = 'English (United States)';
     adobeat.Echosign_dev1__Merge_Mapping__c        = adobemm.id;
     insert adobeat;

    Account servicesite = new Account();
     servicesite.Name                           = 'Cheesy Does It';
     servicesite.Type                           = 'Education';
     servicesite.BillingStreet                  = '704 NE Sample Street';
     servicesite.BillingCity                    = 'Portland';
     servicesite.BillingState                   = 'Oregon';
     servicesite.BillingPostalCode              = '97212';
     servicesite.Organization_Sub_type__c       = 'School';
     servicesite.Service_Site_Status__c         = 'Active';
     servicesite.School_Status__c               = 'Active';
     insert servicesite;

    Contact servicemember = new Contact();
     servicemember.FirstName                    = 'Macaroni';
     servicemember.LastName                     = 'Cheese';
     servicemember.Npe01__HomeEmail__c          = 'macandcheese@aolol.com';
     servicemember.RecordTypeId                 =  servicememberRT.Id;
     insert servicemember;

    Contact leadsupervisor = new Contact();
     leadsupervisor.FirstName                   = 'Head';
     leadsupervisor.LastName                    = 'Cheese';
     leadsupervisor.Npe01__HomeEmail__c         = 'saycheese@aolol.com';
     leadsupervisor.Service_Site_Supervisor2__c = 'Active, Primary';
     insert leadsupervisor;


    Member_Term__c mt = new Member_Term__c();
     mt.Service_Member__c                       = servicemember.Id;
     mt.Service_Site__c                         = servicesite.Id;
     mt.Lead_Supervisor__c                      = leadsupervisor.Id;
     mt.Date_Contract_Signed__c                 = date.today();
     mt.Date_Enrolled__c                        = date.today();
     mt.School_1__c                             = 'Cheesy Does It';
     mt.Healthy_Progress_Report_Area_1__c       = 'B - Field trips, farmer and chef visits';
     mt.Healthy_Progress_Report_Goal_1__c       = 'Win a Million Bucks';
     mt.Goal_1_Resources_Needed__c              = 'A Million Bucks';
     insert mt;

    Member_Term_Evaluation__c mte = new Member_Term_Evaluation__c();
     mte.Member_Term__c                         = mt.Id;
     mte.Service_Member__c                      = servicemember.Id;
     mte.Lead_Supervisor__c                     = leadsupervisor.Id;
     mte.Date_of_Review__c                      = date.today();
     mte.Signed_by_Service_Member__c            = TRUE;
     mte.Signed_by_Supervisor__c                = FALSE;
     insert mte;


     mte.Signed_by_Supervisor__c                = TRUE;
     update mte;
     
    echosign_dev1__SIGN_Agreement__c e = new echosign_dev1__SIGN_Agreement__c();
     e.Name                                    = 'Service Member Term Evaluation';
     e.ECHOSIGN_DEV1__AGREEMENTLOCALE__C       = 'English (United States)';
     e.ECHOSIGN_DEV1__SIGNATURETYPE__C           = 'e-Signature';
     e.ECHOSIGN_DEV1__STATUS__C                  = 'Out for Signature';
     insert e; 
    
     Test.stopTest();

}
}



 
Greetings all, I am adding a system.debug in my trigger and noticed that the values when running a debug are returing null.

My code is listed as 
 
 system.debug(mte.Service_Member__r.FirstName + ' and ' + mte.Lead_Supervisor__r.LastName + ' will be getting their member term evaluation on ' + mte.Date_of_Review__c.format() + 
                            ' for member term ' + mte.Member_Term__c);

The output appears as 

null and null will be getting their member term evaluation on 1/25/17 for member term a0Ig0000007iekyEAA

My goal is to get the output to appear as a value rather than null, the trigger works nicely no less, but still.

Hope it helps.

Joe and Jane will be getting their member term evaluation of 

Hi all, I have developed an apex class and trigger to automatically deploy echoSign agreements based on a criteria that is met in the trigger. However, it appears a web service is being called when I design the class, and implement a test class. 

The goal with this trigger is to automate the sending of agreement templates from echoSign to the contact who will sign the agreement. 
With the @future callout the trigger creates the object but does not run. However without it, it does. Needless to say without the @future callout the test class fails with the Methods defined as TestMetod do not support web service.

Are there any steps I should take.

Here's the class
public class AutoSendAdobeSign { 
    
    public static void sendAgreement(Id temId, Id mteId) { 
    try {
           System.debug('Calling AgreementTemplateService.load: ' + temid + ' - ' + mteid); 
           echosign_dev1.AgreementTemplateService.load( temid , mteid );        
    } catch (Exception E) { System.debug('Exception: ' + e.getStackTraceString());}       
    }
}

The Trigger with the specified crtieria to run
 
trigger SendMTEviaAdobeSign on Member_Term_Evaluation__c (after update) {
        //This Class Automatically Sends an Adobe Sign Agreement for the Member_Term_Evaluation Custom Object


        //For the PY17 Member Term Evaluation, this variable can be updated according to Program Year
    String templateId; 
           templateId = [SELECT Id FROM echosign_dev1__Agreement_Template__c WHERE Name = 'Evaluation' ].Id;
 {
    //Only send when the Signed By Supervisor field is checked off
            for(Member_Term_Evaluation__c mte: Trigger.new) {
                if(mte.Id != NULL && mte.Date_of_Review__c != NULL && mte.Signed_by_Supervisor__c != Trigger.oldMap.get(mte.Id).Signed_by_Supervisor__c ){
                        String masterId = mte.Id;
                        AutoSendAdobeSign.sendAgreement(templateId, masterId);
                        system.debug(mte.Service_Member__r.FirstName + ' and ' + mte.Lead_Supervisor__r.LastName + ' will be getting their member term evaluation on ' + mte.Date_of_Review__c.format() + ' .');
                }
                }
    }
}



Here is my Test Class
@isTest
private class SendMTEviaAdobeSignTest {

static testMethod void insertNewmasterId() {
     Test.startTest();

RecordType servicememberRT = [SELECT Id from RecordType WHERE sObjectType = 'Contact' AND Name = 'Service Member' LIMIT 1];

    Echosign_dev1__SIGN_Merge_Mapping__c adobemm = new Echosign_dev1__SIGN_Merge_Mapping__c();
     adobemm.Name                                = 'masterId';
     adobemm.echosign_dev1__Default__c           = FALSE;
     insert adobemm;                 

    Echosign_dev1__Agreement_Template__c adobeat = new Echosign_dev1__Agreement_Template__c();
     adobeat.Name                                   = 'PY17 Service Member Term Evaluation';
     adobeat.Echosign_dev1__Auto_Send__c            = TRUE;
     adobeat.Echosign_dev1__Name__c                 = 'Adobe Sign Agreement';
     adobeat.Echosign_dev1__Signature_Type__c       = 'e-Signature';
     adobeat.Echosign_dev1__Language__c             = 'English (United States)';
     adobeat.Echosign_dev1__Merge_Mapping__c        = adobemm.id;
     insert adobeat;

    Account servicesite = new Account();
     servicesite.Name                           = 'Cheesy Does It';
     servicesite.Type                           = 'Education';
     servicesite.BillingStreet                  = '704 NE Sample Street';
     servicesite.BillingCity                    = 'Portland';
     servicesite.BillingState                   = 'Oregon';
     servicesite.BillingPostalCode              = '97212';
     servicesite.Organization_Sub_type__c       = 'School';
     servicesite.Service_Site_Status__c         = 'Active';
     servicesite.School_Status__c               = 'Active';
     insert servicesite;

    Contact servicemember = new Contact();
     servicemember.FirstName                    = 'Macaroni';
     servicemember.LastName                     = 'Cheese';
     servicemember.Npe01__HomeEmail__c          = 'macandcheese@aolol.com';
     servicemember.RecordTypeId                 =  servicememberRT.Id;
     insert servicemember;

    Contact leadsupervisor = new Contact();
     leadsupervisor.FirstName                   = 'Head';
     leadsupervisor.LastName                    = 'Cheese';
     leadsupervisor.Npe01__HomeEmail__c         = 'saycheese@aolol.com';
     leadsupervisor.Service_Site_Supervisor2__c = 'Active, Primary';
     insert leadsupervisor;


    Member_Term__c mt = new Member_Term__c();
     mt.Service_Member__c                       = servicemember.Id;
     mt.Service_Site__c                         = servicesite.Id;
     mt.Lead_Supervisor__c                      = leadsupervisor.Id;
     mt.Date_Contract_Signed__c                 = date.today();
     mt.Date_Enrolled__c                        = date.today();
     mt.School_1__c                             = 'Cheesy Does It';
     mt.Healthy_Progress_Report_Area_1__c       = 'B - Field trips, farmer and chef visits';
     mt.Healthy_Progress_Report_Goal_1__c       = 'Win a Million Bucks';
     mt.Goal_1_Resources_Needed__c              = 'A Million Bucks';
     insert mt;

    Member_Term_Evaluation__c mte = new Member_Term_Evaluation__c();
     mte.Member_Term__c                         = mt.Id;
     mte.Service_Member__c                      = servicemember.Id;
     mte.Lead_Supervisor__c                     = leadsupervisor.Id;
     mte.Date_of_Review__c                      = date.today();
     mte.Signed_by_Service_Member__c            = TRUE;
     mte.Signed_by_Supervisor__c                = FALSE;
     insert mte;


     mte.Signed_by_Supervisor__c                = TRUE;
     update mte;
     
    echosign_dev1__SIGN_Agreement__c e = new echosign_dev1__SIGN_Agreement__c();
     e.Name                                    = 'Service Member Term Evaluation';
     e.ECHOSIGN_DEV1__AGREEMENTLOCALE__C       = 'English (United States)';
     e.ECHOSIGN_DEV1__SIGNATURETYPE__C           = 'e-Signature';
     e.ECHOSIGN_DEV1__STATUS__C                  = 'Out for Signature';
     insert e; 
    
     Test.stopTest();

}
}



 
Greetings, I am wondering if there is a way to include two or more fields in an outputPanel tag, as shown below. My output is accounting for two fields, one within the object and the other in a related object (which is a child to the record), I get this message Unknown property 'VisualforceArrayList.Support_a_salad_bar__c'​ when I save. 
 
<messaging:emailTemplate subject="Test" recipientType="Contact" relatedToType="Contact">
<messaging:htmlEmailBody >
<apex:repeat value="{!relatedTo.Member_Schools_Serviced__r}" var="lineItem">
<apex:outputPanel rendered="{!lineItem.Term__c = '2017-2018'&& lineItem.School_Term_Progress_Reports_del__r.Support_a_salad_bar__c = FALSE}">
{!lineItem.Name}
</apex:outputPanel>
</apex:repeat>
</messaging:htmlEmailBody>
</messaging:emailTemplate>

 

Hello,

I am working on the App Customization superbadge and I am having issues with the '# of Volunteers Still Needed' field on the 'Volunteer Shift' object as I am getting that the record is not working as expected error.

The requirement for the field states the following:
Field Label: # of Volunteers Still Needed
Field Purpose: Volunteer Shifts calculates and displays the difference between the number of required volunteers and the shifts taken, or zero, whichever is greater.

Here is the screenshot of the field details and I have highlighted the formula below:
# of Volunteers Still Needed field detail

I also tried IF(Desired_Number_of_Volunteers__c - Shifts_Taken__c > 0, Desired_Number_of_Volunteers__c - Shifts_Taken__c, 0) which also errored out in the same fashion.

Could someone please help me out and figure out what is wrong?

Thanks,
Evin

Hi everyone, I am stuck on the App Customization Superbadge. I have been attempting to create a rollup summary field for shifts taken which filters only records that have a status of completed or confirmed, however, with rollup summary fields, I can only use AND logic, not OR, thus triggering this error message when I attempt to calculate the number of available shifts against desired shifts.

Challenge Not yet complete... here's what's wrong: 
The '# of Volunteers Still Needed' field on the 'Volunteer Shift' record is not working as expected.

Is there anything I am missing?

 
Hi Everyone, I've finally moved up to step on this mighty superbadge, but seem to be stuck on step 10.

Challenge Not yet complete... here's what's wrong: 
The BoatTile component doesn't fire the plotMapMarker event when a user clicks a boat.


My Code is listed below...

PlotMapMarker Event
<aura:event type="APPLICATION" description="PlotMapMarker">
    <aura:attribute name="sObjectId" type="String"/>
    <aura:attribute name="lat" type="String"/>
    <aura:attribute name="long" type="String"/>
    <aura:attribute name="label" type="String"/>
</aura:event>

Boat Tile Component
<aura:component >

    <aura:attribute name="boat" type="Boat__c" />
    <aura:attribute name="selected" type="boolean" default="false"/>
    <aura:registerEvent name="BoatSelect" type="c:BoatSelect"/>
    <aura:registerEvent name="BoatSelected" type="c:BoatSelected"/>
    <aura:registerEvent type="c.PlotMapMarker" name="PlotMapMarker"/>


        <lightning:button onclick="{!c.onBoatClick}"
                          class="{! v.selected ? 'tile selected' : 'tile' }">
            <div style="{!'background-image:url(\'' + v.boat.Picture__c + '\')'}"
                 class="innertile">
                <div class="lower-third">
                    <h1 class="slds-truncate">{! v.boat.Contact__r.Name}</h1>
                </div>
            </div>
        </lightning:button>

</aura:component>

Would love any help.
what is use of system.start(),system.stop() in  salesforce
I have the BoatReviews.cmp built and it looks correct, but I'm not sure the best way to pull the boatReview.CreatedById from the link on the name. I'm thinking it should be coded into the iteration markup, then the onUserInfoClick handler could extract the boatReview.CreatedById from the event... but I can't figure out how to make that work.

I've tried <a href> and <ui:outputURL> in the markup... can't make it work.

How about a hint?
Guys, In challenge 8, i was struck at the point of hyperlinking the CreatedBy to redirect to user detail page. How do we define hyperlinks in lightning. Can anyone share any info on this part.
Hey everyone, 
I keep getting this error in Step 5.

Challenge Not yet complete... here's what's wrong: 
We couldn't find the appropriate CSS for the BoatTile component. Be sure to include it in its own file, rather than inline.

I've tried many different ways and even tried using the CSS as an external resource.


 
I'm using Conga Composer (so Apex isn't an option here) and trying to create a query. It looks like this:
SELECT <fields>
FROM OpportunityLineItem
WHERE OpportunityId = <id>
AND OpportunityId IN (SELECT OpportunityId FROM OpportunityLineItem WHERE ProductCode = <product_code_1>)
AND ProductCode = <product_code_2>
When I try the above with real values I get an error:
The inner and outer selects should not be on the same object type

Explanation:
I'm trying to recreate a report that shows fields from <product_2>, but only if the parent opportunity has products on it with <product_code_1>.
I can do this with a standard report, so I assume there must be a way to do it with SOQL. Here's a screenshot of what that looks like (Sales Price is an Opportunity Product field):
User-added image
 
I am working on the Lightning Component Superbadge and have gotten to step 4, I however, seem to be stuck on the FormSubmit event.
I've written it like this.
 
<aura:event type="COMPONENT"> <aura:attribute name="formsubmit" type="Boat__c[]"/> </aura:event>

But get this message.
Challenge Not yet complete... here's what's wrong: The FormSubmit event isn't configured correctly. There is something missing or improperly configured in the FormSubmit.evt file.
Greetings all, I am working my way up to step 3 on the lightning component superbadge and seem to be on the BoatSeachResults apex class.

I am encountering this message, although my class is written as shown below.

Challenge Not yet complete... here's what's wrong: 
We couldn't find a
getBoats() method with the boatTypeId parameter in the BoatSearchResults Apex controller. Make sure the getBoats() method uses the string data type so that you can pass empty values to it.
 
public with sharing class BoatSearchResults {
    @AuraEnabled
    public static String getBoats(Id boatTypeId) {
        BoatType__c boat = [SELECT Id FROM BoatType__c WHERE Id = :boatTypeId];
        return string.valueOf(boat); 
    }
}

 
I'm not clear why they're instructing us to package up the BoatTypeId as a property of an object called formData. Why not just pass the BoatTypeId directly?  Here's what it says:
 
Use a new event c:FormSubmit named formsubmit with an Object attribute named formData to pass the selected boatTypeId—as a property of formData—from BoatSearchForm to its parent component BoatSearch. Do this via a controller function called onFormSubmit() attached to the Search button.
In the 
BoatSearch component, handle FormSubmit with a controller action named onFormSubmit. Pass formData.boatTypeId from the controller to a public method on the BoatSearchResults component called search.
 
Why not just do this:
onFormSubmit : function(component, event, helper){
        var boatTypeId = component.get("v.selectedType");
        console.log("Search button pressed " + boatTypeId);
        var formSubmit = component.getEvent("formsubmit");
        formSubmit.setParams({"boatTypeId": boatTypeId});
        formSubmit.fire();
    },

 

Hello all,

I'm currently working through Step 7 of the new "Lightning Component Framework Specialist" superbadge, and I'm running into an error while checking the challenge:

"The AddBoatReview controller's onSave() function doesn't fire the BoatReviewAdded event."

The problem is that I'm testing the component right now, and my event is being received by the parent just fine, and my tabset switches to the "Reviews" section like it should, so know it's being handled correctly. I've tried using both a Component event and an Application event just to debug a bit (even though Component is the best option for this scenario), and that doesn't change anything. Any idea what could be triggering this error message?

Relevant code:

AddBoatReviewController.js

onSave : function(component, event, helper){
    	component.set("v.boatReview.Boat__c",component.get("v.boat.Id"));

        component.find("service").saveRecord(function(saveResult) {
            if (saveResult.state === "SUCCESS" || saveResult.state === "DRAFT") {

               var cmpEvent = component.getEvent("reviewAdded");
		       cmpEvent.fire();

               //Attempt at trying an Application event instead
		       //var cmpEvent = $A.get("e.c:BoatReviewAdded");
		       //cmpEvent.fire();


                var resultsToast = $A.get("e.force:showToast");
                //Toast code and other saveResults states below...
AddBoatReview.cmp
<aura:registerEvent name="reviewAdded" type="c:BoatReviewAdded"/>
     
    <!-- Display form -->
    <lightning:layout multipleRows="true">
            <lightning:layoutItem size="12" padding="around-small">
                <lightning:input name="title" label="Title" value="{!v.boatReview.Name}"/>
            </lightning:layoutItem>

            <lightning:layoutItem size="12" padding="around-small">
                <label class="slds-form-element__label" for="input-id-01">Description</label>
                <lightning:inputRichText value="{!v.boatReview.Comment__c}" disabledCategories="FORMAT_FONT"/>
            </lightning:layoutItem>

            <lightning:layoutItem size="12" class="slds-align--absolute-center">
                <lightning:button iconName="utility:save" label="Submit" onclick="{!c.onSave}"/>
            </lightning:layoutItem>
    </lightning:layout>
BoatDetails.cmp
<aura:handler name="reviewAdded" event="c:BoatReviewAdded" action="{!c.onBoatReviewAdded}"/>

BoatDetailsController.js

onBoatReviewAdded : function(component, event, helper) {
	console.log("Event received");
	component.set("v.selTabId", "boatreviewtab");
}
This unit is being pushed as intermediate even though it is missing critical steps towards making use of the material it is presenting, such as step-by-step information how to successfully push the metadata we create and make use of the permissions we are uploading.

As far as I can tell, I am successfully uploading the Customer_interaction_Big_Object.permissionSet through ForceIDE, as I get no errors after save to server, but then this permission set isn't available for me to assign to anyone when I look in the SFDC setup UI for permission sets.

And then I can't upload the data because the object isn't writable, presumably because I don't have permissions.

Morever, the sample "Apex" script isn't even valid Apex.  For examples:
* There shouldn't be any angle brackets in: <Customer_Interaction__b> bo = new Customer_Interaction__b();
* Strings should use single quotes, not double quotes: bo.Account__c = "001R000000302D3";
* Play_Duration__c was defined as a number, not text (and again, double quotes!): bo.Play_Duration__c = "25";

Doesn't anyone give these articles a test drive before publishing them to people who will rely on them?