• Mike Bonner
  • NEWBIE
  • 0 Points
  • Member since 2016

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 0
    Questions
  • 1
    Replies
I am very new to apex development but I have created a class for whenever scrum team is created,
the trigger looks up via account, gathers the account id, queries salesforce to get all contact id related to account id, and shares team record. The class is like so
ScrumTeamSharing
trigger ScrumTeamSharing on agf__ADM_Scrum_Team__c(before insert) {
	if (trigger.isInsert) {
//teamid=a6PA0000000J1AdMAK
//agf__ADM_Scrum_Team__c.Account_ID__c = associated account;
//agf__ADM_Scrum_Team__c.Id = team id;
		List <agf__ADM_Scrum_Team__Share> rShare = new List <agf__ADM_Scrum_Team__Share>();
		agf__ADM_Scrum_Team__Share TeamShare;

		for(agf__ADM_Scrum_Team__c ADM : Trigger.new){
			TeamShare = new agf__ADM_Scrum_Team__Share();
			String IdTeam = ADM.Id;
			String assAcc = ADM.Account_ID__c;

			List<Account> alist = [SELECT Id, Name FROM Account WHERE Id=:assAcc];

			System.debug('a' + alist);

			List<Contact> clist = [SELECT Id, Name FROM Contact WHERE Contact.AccountId IN :alist];

			System.debug('c' + clist);
			
			// Set ID of record being shared
			TeamShare.ParentId = ADM.Id;

			// Set ID of user or group being granted access

			// Set Access Level
			TeamShare.AccessLevel = 'Read';

			//Parse contact Id into the sharing list
			Integer i = clist.size();
			while(i > 0) {
				TeamShare.UserOrGroupId = clist[i].Id;//add to the team reports
				i--;
					}
				}

					// Insert the sharing record and capture the save result. 
		      // The false parameter allows for partial processing if multiple records passed 
		      // into the operation.
		      Database.SaveResult sr = Database.insert(TeamShare,false);

		      // Process the save results.
		      if(sr.isSuccess()){
		         // Indicates success
		         System.debug('Save Success');
		      }
		      else {
		         // Get first save result error.
		         Database.Error err = sr.getErrors()[0];
		         
		         // Check if the error is related to trival access level.
		         // Access level must be more permissive than the object's default.
		         // These sharing records are not required and thus an insert exception is acceptable. 
		         if(err.getStatusCode() == StatusCode.FIELD_FILTER_VALIDATION_EXCEPTION  &&  
		                  err.getMessage().contains('AccessLevel')){
		            // Indicates success.
		            System.debug('Success on mapping error');
		         }
		         else{
		            // Indicates failure.
		            System.debug('Failed to map error');
		         }
		    }	
		}
	}
My test class is as follows
ScrumTeamSharingTest
@isTest 
private class ScrumTeamSharingTest {
	
	@isTest static void testTeamSharing() {
		//create contact for test
		List<Contact> users = new List<Contact>();
		agf__ADM_Scrum_Team__c t = new agf__ADM_Scrum_Team__c();
		Account a = new Account(Name='Test Account');
		t.Name='testTeam';
		t.Account_ID__c=a.Id;
		insert a;
		insert t;
		System.debug('Inserted team & acct: ' + t.Name + ' ' + a.Name);
		for (Integer j=0; j<5;j++) { //j number of contacts per account
			users.add(new Contact(firstname ='Test'+j,
								  lastname  ='Test'+j,
								  AccountId =a.Id));
		}
		insert users;
		}
}
And when it runs the error which I am recieving is like so
Error
ScrumTeamSharingTest: (0/1) Passed

 METHOD RESULT 
testTeamSharing : Fail

 STACK TRACE 
Class.ScrumTeamSharingTest.testTeamSharing: line 11, column 1

 MESSAGE 
System.DmlException: Insert failed. First exception on row 0; first error: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, DedupeReminder: execution of AfterInsert

caused by: System.DmlException: Insert failed. First exception on row 0; first error: INVALID_CROSS_REFERENCE_KEY, invalid cross reference id: []

Trigger.DedupeReminder: line 7, column 1: []