• Jim Parker 7
  • NEWBIE
  • 30 Points
  • Member since 2015

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 8
    Questions
  • 2
    Replies
Hello.  I hav an onclick JS button that runs a flow.  Currently, it opens a new tab and executes correctly.  However, I would like to load the current tab/window with the flow URL vs. opening a new tab.  How do I do that?

Existing code below.  Basically, I need to replace the window.open with something else. 
{!RequireScript("/soap/ajax/34.0/connection.js")} 

if("{!Wire_Template__c.Template_Status__c}" =="Approved"){
var base = '' //system.URL.getSalesforceBaseUrl(); 
var url = base+encodeURI('/flow/Wire_Template_Transfer_from_Locked_Template?WireTemplateId={!Wire_Template__c.Id}&retURL=a04/o'); 

window.open(url)
}


 
Trying to adapt the code from:
https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_interface_QuickAction_QuickActionDefaultsHandler.htm#apex_interface_QuickAction_QuickActionDefaultsHandler_Example

Effectively, on the case quick email action, it automatically strips off CC'd email addresses when you hit reply.  So I am trying to pre-popualte them.  The issue I am having is I don't know how to lookup the email (and the associated to, CC and from addresses) that I am replying to on the case or the most recent email that is registered on the case.  Please help!
 
global class EmailPublisherLoader implements QuickAction.QuickActionDefaultsHandler {
    // Empty constructor
    global EmailPublisherLoader() {
    }
    
    // The main interface method
    global void onInitDefaults(QuickAction.QuickActionDefaults[] defaults) {
        QuickAction.SendEmailQuickActionDefaults sendEmailDefaults = null;
    
    
        // Check if the quick action is the standard Case Feed send email action
        for (Integer j = 0; j < defaults.size(); j++) {
            if (defaults.get(j) instanceof QuickAction.SendEmailQuickActionDefaults && 
               defaults.get(j).getTargetSObject().getSObjectType() == 
                   EmailMessage.sObjectType && 
               defaults.get(j).getActionName().equals('Case.Email') && 
               defaults.get(j).getActionType().equals('Email')) {
                   sendEmailDefaults = 
                       (QuickAction.SendEmailQuickActionDefaults)defaults.get(j);
                   break;
            }
        }
        
        //If stardard case feed email action
        if (sendEmailDefaults != null) {
            
            //Find the case
            Case c = [SELECT Status, Reason, SuppliedEmail, ContactEmail FROM Case 
                      WHERE Id=:sendEmailDefaults.getContextId()];
        
            EmailMessage emailMessage = (EmailMessage)sendEmailDefaults.getTargetSObject();    
			
            
            //No idea how to get the most recent email attached to the case......
            EmailMessage prevEmail = [Select ccAddresses, toAddresses, fromAddress from InboundEmail where ParentId=:sendEmailDefaults.getContextId()]
           
            //on Page load, not reply/reply all to a message
            if (sendEmailDefaults.getInReplyToId() == null) {
                
                //Count to see if previous emails on case
                Integer emailCount = [SELECT count() FROM EmailMessage 
                                      WHERE ParentId=:sendEmailDefaults.getContextId()];
                               
                //previous email attached to existing case
                if (emailCount!= null && emailCount > 0) {
            		              
                    // Set addresses
            		emailMessage.ccAddress = prevEmail.CcAddress;
                    emailMessage.toAddress = prevEmail.fromAddress;
                   
                } 
                
                //no previous email attached
                else {
                    emailMessage.ccAddress = '';
                    emailMessage.toAddress = '';
                    
                }
            } 
            
            //When user hits reply or reply all
            else {
                    // Set addresses
            		emailMessage.ccAddress = prevEmail.CcAddress;
                    emailMessage.toAddress = prevEmail.fromAddress;
                               
            }
        }
    }    
}

 
Hi everyone - trying to transform my Javascript button to a VisualForce or URL button so that is shows up in SF1.  Don't really know where to start.  This is the existing button.
 
{!RequireScript("/soap/ajax/34.0/connection.js")} 

if("{!Wire_Template__c.Template_Status__c}" =="Approved"){
var base = '' //system.URL.getSalesforceBaseUrl(); 
var url = base+encodeURI('/flow/Wire_Template_Transfer_from_Locked_Template?WireTemplateId={!Wire_Template__c.Id}&retURL=a04/o'); 

window.open(url)
}

else{
alert("Please submit the template for approval prior to submitting a wire.");
}

 
Hello - trying to send out an email to the case creator anytime someone adds a "post" to a case on the feed view.  I am however struggling.  I am trying to send out an email based on an email template that already exists.  Few issues that I am having - what object should I set the trigger on (FeedItem?), how do I limit the trigger to only be "posts" on Cases, how do I extract the message out of the post, how do I send an email based on an email template, and how do I include the post text in the email template?  Gave it a start but got lost...  Any coding help would be greatly appreciated. 
 
trigger FeedItemAddedCase on FeedItem (after insert) {
	Set<ID> feedIds = new Set<ID>();
    for (FeedItem n:Trigger.new){
        feedIds.add(n.parentID);
    }
    List<Case> caseList = new List<Case>([Select id, CaseNumber, Subject, Case_Creator_Employee_Email__c from Case where ID in:feedIds limit 1]);
    EmailTemplate templateId = [Select id from EmailTemplate where name = 'Case Note Alert - Internal'];
    
    for(Case c:caseList){
        Messaging.reserveSingleEmailCapacity(1);
    	Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
    	String[] toAddresses; 
        toAddresses = new String [] {c.Case_Creator_Employee_Email__c};
        mail.setToAddresses(toAddresses);
   		mail.setReplyTo('supportresponse@test.com');
    	mail.setSenderDisplayName('Test Bank');
    	mail.setSubject('' + case.Id);
        Messaging.sendEmail(new Messaging.Email[] { mail } , true);
    }



}

 
So I am having an issue updating a variable.  In essence, I want to choose a "User" based upon a condition.  If the case has an employee email address on it, then use the User that has that email address.  Otherwise, use the CreatedById.  I have a User record called finalUser.  I created finalUser early and then am trying to update the finalUser.Id based upon those two scenarios.  I verified that I have an valid ID before setting finalUser equal to that but when I check to see if finalUser was updated after with a debug, the variable is still set to null.  I am new to SOQL so I am clearly doing an assignment incorrectly... Help!  I commented where it is broken. 
trigger CaseTeamTrigger on Case (after insert) {
/**
   * Comments:
   * To give visiblity into the Case records that were created by a User, we 
   * will add them to the CaseTeamMember list when a particular record is 
   * updated. The user should only be added to the CaseTeamMember table once.
   * 
   * Additionally, add case teams based on user role. 
   */
   
    Map<Id, CaseTeamMember> membersToAdd = new Map<Id, CaseTeamMember>();
    Map<Id, CaseTeamTemplate> teamsToAdd = new Map<Id, CaseTeamTemplate>();
    List<User> employeeEmailSubmitter;
    Id employeeEmailID;
    User finalUser = new User();
    UserRole userRoleID = new UserRole();
    
    //Finds the case teams
	list <CaseTeamTemplate> bethesdaTeam = [Select Id, Name from CaseTeamTemplate where Name ='Bethesda Team' limit 1];
    list <CaseTeamTemplate> busDevTeam = [Select Id, Name from CaseTeamTemplate where Name ='Business Development Team'  limit 1];
    list <CaseTeamTemplate> commDepTeam = [Select Id, Name from CaseTeamTemplate where Name ='Commerical Deposits Team'  limit 1];
    list <CaseTeamTemplate> dcTeam = [Select Id, Name from CaseTeamTemplate where Name ='DC Team'  limit 1];
    list <CaseTeamTemplate> hcDepTeam = [Select Id, Name from CaseTeamTemplate where Name ='Healthcare Deposits Team' limit 1];
    list <CaseTeamTemplate> herndonTeam = [Select Id, Name from CaseTeamTemplate where Name ='Herndon Team' limit 1];
    list <CaseTeamTemplate> itTeam = [Select Id, Name from CaseTeamTemplate where Name ='IT Help Desk' limit 1];
    list <CaseTeamTemplate> potomacTeam = [Select Id, Name from CaseTeamTemplate where Name ='Potomac Team' limit 1];
    list <CaseTeamTemplate> rockvilleTeam = [Select Id, Name from CaseTeamTemplate where Name ='Rockville Team' limit 1];
    list <CaseTeamTemplate> corpLenders = [Select Id, Name from CaseTeamTemplate where Name ='Corporate Lending Team' limit 1];
    list <CaseTeamTemplate> finalTeam;
    
    //Finds the case triggered
    List<Case> cases = [Select Id, OwnerId, CreatedById, Case_Creator_Employee_Email__c 
                  from Case where id IN :Trigger.newMap.keySet()];
    
    //Determine case creater
    for (Case c : cases) {
		employeeEmailSubmitter = [Select ID, Email from User where Email =: c.Case_Creator_Employee_Email__c limit 1];
        //if no results returned with an employee email match, then use CreatorID
        if (employeeEmailSubmitter.isEmpty() && c.CreatedbyId != null)  {
            System.debug('*******************************************'); 
            System.debug('Made it to the no employee email case - ' + c.CreatedById);
//THIS DOESN"T WORK
        	finalUser.Id =c.CreatedById ;
            update finalUser;
            System.debug('FinalUser ID - ' + finalUser.Id);
        }
        //If Employee Email match found, use that employee
        Else if (!employeeEmailSubmitter.isEmpty()){
            for (User user : employeeEmailSubmitter){
                if (user.Id != null){
                    System.debug('*******************************************'); 
            		System.debug('Made it to the employee email match -' + user.Id);
//THIS DOESN"T WORK
            		finalUser.Id = user.Id;
                    update finalUser;
                    System.debug('FinalUser ID - ' + finalUser.Id);
                }
            }
        }
   }       
    
   //Determine User Role of case submitter 
   System.debug('*******************************************'); 
   System.debug('Final User Role ID Name ' + finalUser.UserRoleId);
   List <UserRole> userRoles = ([Select Id, Name from UserRole where Id =: finalUser.UserRoleId limit 1]);
    if (!userRoles.isEmpty()){
    	for (UserRole role: userRoles){
       		userRoleID.Id = role.Id;
        }
   } 		
   
    
    //map role to case team
    System.debug('*******************************************'); 
    System.debug('Role ID Name ' + UserRoleID.Id);
    If (UserRoleID.Name == 'Bethesda Branch Manager') {for (CaseTeamTemplate team : bethesdaTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Bethesda Staff') {for (CaseTeamTemplate team : bethesdaTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Business Development Officers') {for (CaseTeamTemplate team : busDevTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Business Development Staff'){for (CaseTeamTemplate team : busDevTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'DC Branch Manager'){for (CaseTeamTemplate team : dcTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'DC Staff'){for (CaseTeamTemplate team : dcTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Herndon Branch Manager'){for (CaseTeamTemplate team : herndonTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Herndon Staff'){for (CaseTeamTemplate team : herndonTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Lending Branch Deposit Staff'){for (CaseTeamTemplate team : hcDepTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Potomac Branch Manager'){for (CaseTeamTemplate team : potomacTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Potomac Staff'){for (CaseTeamTemplate team : potomacTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Rockville Branch Manager'){for (CaseTeamTemplate team : rockvilleTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Rockville Staff'){for (CaseTeamTemplate team : rockvilleTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Commercial Deposits Manager'){for (CaseTeamTemplate team : commDepTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Commercial Deposits Staff'){for (CaseTeamTemplate team : commDepTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'IT Employees'){for (CaseTeamTemplate team : itTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Corporate Lenders'){for (CaseTeamTemplate team : corpLenders) finalTeam.add(team); }    
      
    
    //create list of new members to add
    for (Case c : cases) {
        if (c.Id != null && finalUser.Id!= null){
        	System.debug('*******************************************'); 
        	System.debug('Made it to the new member list add');
    		membersToAdd.put(c.Id, new CaseTeamMember(             
            	ParentId = c.Id,                           
            	MemberId = finalUser.Id ) );

        }
        
      
    }

    List <CaseTeamRole> caseTeamRl = [SELECT Id, Name FROM CaseTeamRole WHERE Name = 'Case Creator' LIMIT 1];    
    //add case creator to list
    //
    	        System.debug('*******************************************'); 
          		System.debug('Made it before IF - ' + membersToAdd.isEmpty() + ' ' + caseTeamRl.isEmpty() );
    if (!membersToAdd.isEmpty() && !caseTeamRl.isEmpty()) {
      try {
    	        System.debug('*******************************************'); 
          		System.debug('Made it in Role If');
        		for (CaseTeamMember ctm : membersToAdd.values()) {
                    for (CaseTeamRole role : caseTeamRl) {
          			System.debug('*******************************************'); 
          			System.debug('Made it to the Case Creator List addition');
          			ctm.TeamRoleId = role.Id;
                	}
                }
        
    
    	for (CaseTeamMember ctm : [SELECT Id, MemberId, ParentId
                       FROM CaseTeamMember
                       WHERE ParentId IN :membersToAdd.keySet()
                       AND MemberId =: finalUser.Id
                       ORDER BY ParentId]) {
                       
       
        System.debug('*******************************************'); 
        System.debug('Made it to the individual user delete');
          if (membersToAdd.containsKey(ctm.ParentId)) {
            membersToAdd.remove(ctm.ParentId);
          }
        }
         
    if (!membersToAdd.isEmpty()) {
          System.debug('*******************************************'); 
          System.debug('Made it to the individual user insert');
          insert membersToAdd.values();
        }
        
        } catch (System.QueryException qe) {}
    }
    
    //add case teams
    System.debug('*******************************************'); 
    System.debug('Made it to top of teams Add if - ' + teamsToAdd.isEmpty());
      if (!teamsToAdd.isEmpty()) {
      try {
        CaseTeamTemplateRecord caseTeamLink;          
        for(Case caseEval: cases){
            for (CaseTeamTemplate team : finalTeam){
				caseTeamLink= new CaseTeamTemplateRecord(ParentId =caseEval.Id, TeamTemplateId = team.Id );
            	}
            }
          if (caseTeamLink!=null) {
            System.debug('*******************************************'); 
            System.debug('Made it to the case team insert');
        	insert caseTeamLink;
          }
 
        } catch (System.QueryException qe) {}
    }
    
    
    
}


 
I have two fields on an account - SSN_TIN_Key__C and SSN_TIN__C;  The SSN_TIN_Key__C is a cleartext text field which will be used as a unique key and wil lonly be accessible to super users.  SSN_TIN__C is what will be displayed to the user and is an encrpyted text field so  I can mask the field for certain users.  What I want to be able to do is have users be able to update the SSN field they see (eg. SSN_TIN__C) and have that update SSN_TIN_Key__C.  Similarly, if on an upsert, if SSN_TIN_Key__C changes (or is created),  I want to update the field users can see SSN_TIN__C.  I created a trigger as process won't let you do ischanged on an encrpyted field.  However, I get a failure message that says 

common.apex.runtime.impl.DmlExecutionException: Update failed. First exception on row 0 with id XXX; first error: SELF_REFERENCE_FROM_TRIGGER, Object (id = XXX) is currently in trigger RelationshipTrigger, therefore it cannot recursively update itself: []"|0x6c21e43e

What am I doing wrong?
public class RelationshipUtil {
    public static void SSNKeyChanged (List<Account> incomingAcct) {
        try {
                System.debug('Got to SSNKeyChanged entered');
                Set<Id> st_ParentId = new Set<Id>();
                for(Account acctsEvaled : incomingAcct)
                {
                   st_ParentId.add(acctsEvaled.Id);
                }
				Map<Id, Account> relatedAcctMap;
            	if(st_ParentId!=null && !st_ParentId.isEmpty())
               	{	
                	relatedAcctMap = new Map<Id, Account>([SELECT Id, SSN_TIN__c, SSN_TIN_Key__c 
													FROM Account
													WHERE Id IN :st_ParentId limit 1]); 
                    System.debug('Got to SSNKeyChanged lookup');
               	}		 
				for (Account acctsEvaled : incomingAcct) 
            	{
                    System.debug('Got to SSNKeyChanged foor loop');
              		if(relatedAcctMap!=null && relatedAcctMap.containsKey(acctsEvaled.Id))
                	{
                        //Updates the displayed SSN based upon the new Key
                         System.debug('Got to SSNKeyChanged entered for if');
                        relatedAcctMap.get(acctsEvaled.Id).SSN_TIN__c = relatedAcctMap.get(acctsEvaled.Id).SSN_TIN_Key__c;
                         System.debug('Got to SSNKeyChanged set');
				    }
             	}
           		if(relatedAcctMap!=null && relatedAcctMap.values()!=null)
                {
			   		update relatedAcctMap.values();
                    System.debug('Got to SSNKeyChanged update');
                }
        
        } catch (Exception e) {
            System.debug('Issue with SSNKeyChanged: ' + e.getMessage());
        }
    }
    
    
        public static void SSNDisplayChanged (List<Account> incomingAcct) {
        try {
                Set<Id> st_ParentId = new Set<Id>();
                for(Account acctsEvaled : incomingAcct)
                {
                   st_ParentId.add(acctsEvaled.Id);
                }
				Map<Id, Account> relatedAcctMap;
            	if(st_ParentId!=null && !st_ParentId.isEmpty())
               	{	
                	relatedAcctMap = new Map<Id, Account>([SELECT Id, SSN_TIN__c, SSN_TIN_Key__c 
													FROM Account
													WHERE Id IN :st_ParentId limit 1]); 
               	}		 
				for (Account acctsEvaled : incomingAcct) 
            	{
              		if(relatedAcctMap!=null && relatedAcctMap.containsKey(acctsEvaled.Id))
                	{
                        //Updates the Key with the new values input by the user
                	     relatedAcctMap.get(acctsEvaled.Id).SSN_TIN_Key__c = relatedAcctMap.get(acctsEvaled.Id).SSN_TIN__c;
                        System.debug('Got to SSNDisplayChanged set');
				    }
             	}
           		if(relatedAcctMap!=null && relatedAcctMap.values()!=null)
                {
                    System.debug('Got to SSNDisplayChanged update');
			   		update relatedAcctMap.values();
                }
        
        } catch (Exception e) {
            System.debug('Issue with SSNDisplayChanged: ' + e.getMessage());
        }
    }
    
}


trigger RelationshipTrigger on Account (before insert, before update) {
        System.debug('Start Relationship Before Trigger');  
    List<Account> changedSSNKey = new List<Account>();
    List<Account> changedSSNDisplay = new List<Account>();
	
	for (Account acct : Trigger.new) {
  
        Account oldAcct = Trigger.oldMap.get(acct.Id);
        String oldSSNDisplay = oldAcct.SSN_TIN__c;
        String oldSSNKey = oldAcct.SSN_TIN_Key__c;
        System.debug('Old SSN_TIN__C = ' + oldSSNDisplay);
        System.debug('Old SSN_TIN_Key__C = ' + oldSSNKey);        
        
        //Checks to see if the displayed TIN changed (eg. user put in new value)
        if(oldSSNDisplay != acct.SSN_TIN__c)
        {
			changedSSNDisplay.add(acct); 
                //If Displayed SSN changed, then need to update the unique key
			if (changedSSNDisplay.isEmpty() == false)
				RelationshipUtil.SSNDisplayChanged(changedSSNDisplay);
        }
        
        //Checks to see if unique key changed
        if(oldSSNKey != acct.SSN_TIN_KEY__C)
        {
            changedSSNKey.add(acct);
           //If SSN Key changed, then need to updated the displayed value
			if (changedSSNKey.isEmpty() == false)    
    			RelationshipUtil.SSNKeyChanged(changedSSNKey);
        }
	}

    

}

 
Getting a compile error - Invalid Initial Value Type List for List.  Line 14 (commented below).  In essence, I have a trigger on dsfs__DocuSign_Status__c.  dsfs__DocuSign_Status__c has a field dsfs__Case__c which is an ID of a case.  Anytime the trigger occurs, I want to set the "Status" field on the case identified by dsfs__Case__c to newStatus.  Any thoughts on what I am doing wrong?
public class DocusignStatusUtil {
    public static void updateCaseStatus (List<dsfs__DocuSign_Status__c> envelopes, String newStatus) {
        try {
                Set<Id> st_ParentId = new Set<Id>();
                 for(dsfs__DocuSign_Status__c envelopesEvaluated : envelopes)
                     {
                       st_ParentId.add(envelopesEvaluated.dsfs__Case__c);
                     }

			List<Id> relatedCasesMap;
            if(st_ParentId!=null && !st_ParentId.isEmpty())
               {
//this is where the error is
                	relatedCasesMap = new List<Id>([SELECT Id 
													FROM Case
													WHERE Id IN :st_ParentId limit 1]); 
               }
               
															 
			for (dsfs__DocuSign_Status__c envelopesEvaluated : envelopes) 
            {
               if(relatedCasesMap!=null && relatedCasesMap.containsKey(envelopesEvaluated.dsfs__Case__c))
                  {
                     
				relatedCasesMap.get(envelopesEvaluated.dsfs__Case__c).Status = newStatus;
				
		          }
             }
           

			if(relatedCasesMap!=null && relatedCasesMap.values()!=null)
			   update relatedCasesMap.values();
        
        } catch (Exception e) {
            System.debug('Issue with the Horizon Case Update: ' + e.getMessage());
        }
    }
}


 
Having a coding issue that I can't figure out.... New to this and feel like I am missing something.

Creating a trigger on a joiner object (Horizon_Account_Cases__c) between cases and a custom object (Horizon_Account__c) which has only two fields (Horizon_Acct__c and Case__c) which are unique keys for the ID's on the two related object cases.  Upon triggering on Horizon_Account_Cases__c, the related case (eg Case__C) should have its field Related_Horizon_Account__c updated with the value in the joiner object that triggered (Horizon_Acct__c).  Can't get it to compile and need help!  I am sure I am missing something very obvious...

public class horizonCaseLinkUtil {
    
    public static void addHorizonToCase (List<sObject> linkIds) {
        try {
        
        List<Case> casesToUpdate = [select Id 
                                            from Case caseUsed
                                            where Id in :linkIds.Case__c 
                                                         limit 1];                                                         

        List<Horizon_Account__c> horizonAccounts = [select     Id
                                            from Horizon_Account__c hzActCase
                                            where Id in :linkIds.Horizon_Acct__c
                                                         limit 1];                                                         
                                                         
        for (Case cases : casesToUpdate) 
        {
            for (Horizon_Account__c horizon : horizonAccounts)
            {
                cases.Related_Horizon_Account__c = horizon.Id;
            }
            
        }
        update casesToUpdate;
        }
        catch (Exception e) {
            System.debut('Issue with the Horizon Case Update: ' +e.getMessage() );
        }
    }
    
}


trigger HorizonAcctCaseLinked on Horizon_Account_Cases__c (after insert, after update) {
            List<sObject> linkedHorizonCase = new List<sObject>();
            for (Horizon_Account_Cases__c hzActCase : Trigger.new)
                linkedHorizonCase.add(hzActCase);
            if (linkedHorizonCase.isEmpty() == false)
            {
                horizonCaseLinkUtil.addHorizonToCase(linkedHorizonCase);
            }   
}


@isTest(SeeAllData=true)
public class HorizonCaseLinkTest {
        static testMethod void caseLinkTestMethod() {
        List<sObject> sourceList = [SELECT Id 
        FROM Horizon_Account_Cases__c LIMIT 1];
        Case c = new Case(Subject = 'Test Case');
        Horizon_Account__c horizonAcct = new Horizon_Account__c (Name='Test Horizon Acct');
        if(sourceList.size() == 0) {
            sourceList.add(
                    new Horizon_Account_Cases__c(Case__c =c.Id, Horizon_Acct__c=horizonAcct.Name)
            );
        }
        horizonCaseLinkUtil.addHorizonToCase( sourceList );
        }
}

 
So I am having an issue updating a variable.  In essence, I want to choose a "User" based upon a condition.  If the case has an employee email address on it, then use the User that has that email address.  Otherwise, use the CreatedById.  I have a User record called finalUser.  I created finalUser early and then am trying to update the finalUser.Id based upon those two scenarios.  I verified that I have an valid ID before setting finalUser equal to that but when I check to see if finalUser was updated after with a debug, the variable is still set to null.  I am new to SOQL so I am clearly doing an assignment incorrectly... Help!  I commented where it is broken. 
trigger CaseTeamTrigger on Case (after insert) {
/**
   * Comments:
   * To give visiblity into the Case records that were created by a User, we 
   * will add them to the CaseTeamMember list when a particular record is 
   * updated. The user should only be added to the CaseTeamMember table once.
   * 
   * Additionally, add case teams based on user role. 
   */
   
    Map<Id, CaseTeamMember> membersToAdd = new Map<Id, CaseTeamMember>();
    Map<Id, CaseTeamTemplate> teamsToAdd = new Map<Id, CaseTeamTemplate>();
    List<User> employeeEmailSubmitter;
    Id employeeEmailID;
    User finalUser = new User();
    UserRole userRoleID = new UserRole();
    
    //Finds the case teams
	list <CaseTeamTemplate> bethesdaTeam = [Select Id, Name from CaseTeamTemplate where Name ='Bethesda Team' limit 1];
    list <CaseTeamTemplate> busDevTeam = [Select Id, Name from CaseTeamTemplate where Name ='Business Development Team'  limit 1];
    list <CaseTeamTemplate> commDepTeam = [Select Id, Name from CaseTeamTemplate where Name ='Commerical Deposits Team'  limit 1];
    list <CaseTeamTemplate> dcTeam = [Select Id, Name from CaseTeamTemplate where Name ='DC Team'  limit 1];
    list <CaseTeamTemplate> hcDepTeam = [Select Id, Name from CaseTeamTemplate where Name ='Healthcare Deposits Team' limit 1];
    list <CaseTeamTemplate> herndonTeam = [Select Id, Name from CaseTeamTemplate where Name ='Herndon Team' limit 1];
    list <CaseTeamTemplate> itTeam = [Select Id, Name from CaseTeamTemplate where Name ='IT Help Desk' limit 1];
    list <CaseTeamTemplate> potomacTeam = [Select Id, Name from CaseTeamTemplate where Name ='Potomac Team' limit 1];
    list <CaseTeamTemplate> rockvilleTeam = [Select Id, Name from CaseTeamTemplate where Name ='Rockville Team' limit 1];
    list <CaseTeamTemplate> corpLenders = [Select Id, Name from CaseTeamTemplate where Name ='Corporate Lending Team' limit 1];
    list <CaseTeamTemplate> finalTeam;
    
    //Finds the case triggered
    List<Case> cases = [Select Id, OwnerId, CreatedById, Case_Creator_Employee_Email__c 
                  from Case where id IN :Trigger.newMap.keySet()];
    
    //Determine case creater
    for (Case c : cases) {
		employeeEmailSubmitter = [Select ID, Email from User where Email =: c.Case_Creator_Employee_Email__c limit 1];
        //if no results returned with an employee email match, then use CreatorID
        if (employeeEmailSubmitter.isEmpty() && c.CreatedbyId != null)  {
            System.debug('*******************************************'); 
            System.debug('Made it to the no employee email case - ' + c.CreatedById);
//THIS DOESN"T WORK
        	finalUser.Id =c.CreatedById ;
            update finalUser;
            System.debug('FinalUser ID - ' + finalUser.Id);
        }
        //If Employee Email match found, use that employee
        Else if (!employeeEmailSubmitter.isEmpty()){
            for (User user : employeeEmailSubmitter){
                if (user.Id != null){
                    System.debug('*******************************************'); 
            		System.debug('Made it to the employee email match -' + user.Id);
//THIS DOESN"T WORK
            		finalUser.Id = user.Id;
                    update finalUser;
                    System.debug('FinalUser ID - ' + finalUser.Id);
                }
            }
        }
   }       
    
   //Determine User Role of case submitter 
   System.debug('*******************************************'); 
   System.debug('Final User Role ID Name ' + finalUser.UserRoleId);
   List <UserRole> userRoles = ([Select Id, Name from UserRole where Id =: finalUser.UserRoleId limit 1]);
    if (!userRoles.isEmpty()){
    	for (UserRole role: userRoles){
       		userRoleID.Id = role.Id;
        }
   } 		
   
    
    //map role to case team
    System.debug('*******************************************'); 
    System.debug('Role ID Name ' + UserRoleID.Id);
    If (UserRoleID.Name == 'Bethesda Branch Manager') {for (CaseTeamTemplate team : bethesdaTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Bethesda Staff') {for (CaseTeamTemplate team : bethesdaTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Business Development Officers') {for (CaseTeamTemplate team : busDevTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Business Development Staff'){for (CaseTeamTemplate team : busDevTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'DC Branch Manager'){for (CaseTeamTemplate team : dcTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'DC Staff'){for (CaseTeamTemplate team : dcTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Herndon Branch Manager'){for (CaseTeamTemplate team : herndonTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Herndon Staff'){for (CaseTeamTemplate team : herndonTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Lending Branch Deposit Staff'){for (CaseTeamTemplate team : hcDepTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Potomac Branch Manager'){for (CaseTeamTemplate team : potomacTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Potomac Staff'){for (CaseTeamTemplate team : potomacTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Rockville Branch Manager'){for (CaseTeamTemplate team : rockvilleTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Rockville Staff'){for (CaseTeamTemplate team : rockvilleTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Commercial Deposits Manager'){for (CaseTeamTemplate team : commDepTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Commercial Deposits Staff'){for (CaseTeamTemplate team : commDepTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'IT Employees'){for (CaseTeamTemplate team : itTeam) finalTeam.add(team); }
    else if (UserRoleID.Name == 'Corporate Lenders'){for (CaseTeamTemplate team : corpLenders) finalTeam.add(team); }    
      
    
    //create list of new members to add
    for (Case c : cases) {
        if (c.Id != null && finalUser.Id!= null){
        	System.debug('*******************************************'); 
        	System.debug('Made it to the new member list add');
    		membersToAdd.put(c.Id, new CaseTeamMember(             
            	ParentId = c.Id,                           
            	MemberId = finalUser.Id ) );

        }
        
      
    }

    List <CaseTeamRole> caseTeamRl = [SELECT Id, Name FROM CaseTeamRole WHERE Name = 'Case Creator' LIMIT 1];    
    //add case creator to list
    //
    	        System.debug('*******************************************'); 
          		System.debug('Made it before IF - ' + membersToAdd.isEmpty() + ' ' + caseTeamRl.isEmpty() );
    if (!membersToAdd.isEmpty() && !caseTeamRl.isEmpty()) {
      try {
    	        System.debug('*******************************************'); 
          		System.debug('Made it in Role If');
        		for (CaseTeamMember ctm : membersToAdd.values()) {
                    for (CaseTeamRole role : caseTeamRl) {
          			System.debug('*******************************************'); 
          			System.debug('Made it to the Case Creator List addition');
          			ctm.TeamRoleId = role.Id;
                	}
                }
        
    
    	for (CaseTeamMember ctm : [SELECT Id, MemberId, ParentId
                       FROM CaseTeamMember
                       WHERE ParentId IN :membersToAdd.keySet()
                       AND MemberId =: finalUser.Id
                       ORDER BY ParentId]) {
                       
       
        System.debug('*******************************************'); 
        System.debug('Made it to the individual user delete');
          if (membersToAdd.containsKey(ctm.ParentId)) {
            membersToAdd.remove(ctm.ParentId);
          }
        }
         
    if (!membersToAdd.isEmpty()) {
          System.debug('*******************************************'); 
          System.debug('Made it to the individual user insert');
          insert membersToAdd.values();
        }
        
        } catch (System.QueryException qe) {}
    }
    
    //add case teams
    System.debug('*******************************************'); 
    System.debug('Made it to top of teams Add if - ' + teamsToAdd.isEmpty());
      if (!teamsToAdd.isEmpty()) {
      try {
        CaseTeamTemplateRecord caseTeamLink;          
        for(Case caseEval: cases){
            for (CaseTeamTemplate team : finalTeam){
				caseTeamLink= new CaseTeamTemplateRecord(ParentId =caseEval.Id, TeamTemplateId = team.Id );
            	}
            }
          if (caseTeamLink!=null) {
            System.debug('*******************************************'); 
            System.debug('Made it to the case team insert');
        	insert caseTeamLink;
          }
 
        } catch (System.QueryException qe) {}
    }
    
    
    
}


 
I have two fields on an account - SSN_TIN_Key__C and SSN_TIN__C;  The SSN_TIN_Key__C is a cleartext text field which will be used as a unique key and wil lonly be accessible to super users.  SSN_TIN__C is what will be displayed to the user and is an encrpyted text field so  I can mask the field for certain users.  What I want to be able to do is have users be able to update the SSN field they see (eg. SSN_TIN__C) and have that update SSN_TIN_Key__C.  Similarly, if on an upsert, if SSN_TIN_Key__C changes (or is created),  I want to update the field users can see SSN_TIN__C.  I created a trigger as process won't let you do ischanged on an encrpyted field.  However, I get a failure message that says 

common.apex.runtime.impl.DmlExecutionException: Update failed. First exception on row 0 with id XXX; first error: SELF_REFERENCE_FROM_TRIGGER, Object (id = XXX) is currently in trigger RelationshipTrigger, therefore it cannot recursively update itself: []"|0x6c21e43e

What am I doing wrong?
public class RelationshipUtil {
    public static void SSNKeyChanged (List<Account> incomingAcct) {
        try {
                System.debug('Got to SSNKeyChanged entered');
                Set<Id> st_ParentId = new Set<Id>();
                for(Account acctsEvaled : incomingAcct)
                {
                   st_ParentId.add(acctsEvaled.Id);
                }
				Map<Id, Account> relatedAcctMap;
            	if(st_ParentId!=null && !st_ParentId.isEmpty())
               	{	
                	relatedAcctMap = new Map<Id, Account>([SELECT Id, SSN_TIN__c, SSN_TIN_Key__c 
													FROM Account
													WHERE Id IN :st_ParentId limit 1]); 
                    System.debug('Got to SSNKeyChanged lookup');
               	}		 
				for (Account acctsEvaled : incomingAcct) 
            	{
                    System.debug('Got to SSNKeyChanged foor loop');
              		if(relatedAcctMap!=null && relatedAcctMap.containsKey(acctsEvaled.Id))
                	{
                        //Updates the displayed SSN based upon the new Key
                         System.debug('Got to SSNKeyChanged entered for if');
                        relatedAcctMap.get(acctsEvaled.Id).SSN_TIN__c = relatedAcctMap.get(acctsEvaled.Id).SSN_TIN_Key__c;
                         System.debug('Got to SSNKeyChanged set');
				    }
             	}
           		if(relatedAcctMap!=null && relatedAcctMap.values()!=null)
                {
			   		update relatedAcctMap.values();
                    System.debug('Got to SSNKeyChanged update');
                }
        
        } catch (Exception e) {
            System.debug('Issue with SSNKeyChanged: ' + e.getMessage());
        }
    }
    
    
        public static void SSNDisplayChanged (List<Account> incomingAcct) {
        try {
                Set<Id> st_ParentId = new Set<Id>();
                for(Account acctsEvaled : incomingAcct)
                {
                   st_ParentId.add(acctsEvaled.Id);
                }
				Map<Id, Account> relatedAcctMap;
            	if(st_ParentId!=null && !st_ParentId.isEmpty())
               	{	
                	relatedAcctMap = new Map<Id, Account>([SELECT Id, SSN_TIN__c, SSN_TIN_Key__c 
													FROM Account
													WHERE Id IN :st_ParentId limit 1]); 
               	}		 
				for (Account acctsEvaled : incomingAcct) 
            	{
              		if(relatedAcctMap!=null && relatedAcctMap.containsKey(acctsEvaled.Id))
                	{
                        //Updates the Key with the new values input by the user
                	     relatedAcctMap.get(acctsEvaled.Id).SSN_TIN_Key__c = relatedAcctMap.get(acctsEvaled.Id).SSN_TIN__c;
                        System.debug('Got to SSNDisplayChanged set');
				    }
             	}
           		if(relatedAcctMap!=null && relatedAcctMap.values()!=null)
                {
                    System.debug('Got to SSNDisplayChanged update');
			   		update relatedAcctMap.values();
                }
        
        } catch (Exception e) {
            System.debug('Issue with SSNDisplayChanged: ' + e.getMessage());
        }
    }
    
}


trigger RelationshipTrigger on Account (before insert, before update) {
        System.debug('Start Relationship Before Trigger');  
    List<Account> changedSSNKey = new List<Account>();
    List<Account> changedSSNDisplay = new List<Account>();
	
	for (Account acct : Trigger.new) {
  
        Account oldAcct = Trigger.oldMap.get(acct.Id);
        String oldSSNDisplay = oldAcct.SSN_TIN__c;
        String oldSSNKey = oldAcct.SSN_TIN_Key__c;
        System.debug('Old SSN_TIN__C = ' + oldSSNDisplay);
        System.debug('Old SSN_TIN_Key__C = ' + oldSSNKey);        
        
        //Checks to see if the displayed TIN changed (eg. user put in new value)
        if(oldSSNDisplay != acct.SSN_TIN__c)
        {
			changedSSNDisplay.add(acct); 
                //If Displayed SSN changed, then need to update the unique key
			if (changedSSNDisplay.isEmpty() == false)
				RelationshipUtil.SSNDisplayChanged(changedSSNDisplay);
        }
        
        //Checks to see if unique key changed
        if(oldSSNKey != acct.SSN_TIN_KEY__C)
        {
            changedSSNKey.add(acct);
           //If SSN Key changed, then need to updated the displayed value
			if (changedSSNKey.isEmpty() == false)    
    			RelationshipUtil.SSNKeyChanged(changedSSNKey);
        }
	}

    

}