function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
Jeff GillisJeff Gillis 

Enterprise Territory Management (OppTerrAssignDefaultLogicFilter) Test Class Error

Hi,

I am in the process of implementing the territories within Salesforce and was following the instructions and sample code from the help documents here: 
https://developer.salesforce.com/docs/atlas.en-us.apexref.meta/apexref/apex_interface_TerritoryMgmt_OpportunityTerritory2AssignmentFilter.htm

I have setup the apex class which is as follows:
/*** Apex version of the default logic.
* If opportunity's assigned account is assigned to
*  Case 1: 0 territories in active model
*            then set territory2Id = null
*  Case 2: 1 territory in active model
*            then set territory2Id = account's territory2Id
*  Case 3: 2 or more territories in active model
*            then set territory2Id = account's territory2Id that is of highest priority.
*            But if multiple territories have same highest priority, then set territory2Id = null 
*/
global class OppTerrAssignDefaultLogicFilter implements TerritoryMgmt.OpportunityTerritory2AssignmentFilter { 
    /**
     * No-arg constructor.
     */ 
     global OppTerrAssignDefaultLogicFilter() {}

     /**
      * Get mapping of opportunity to territory2Id. The incoming list of opportunityIds contains only those with IsExcludedFromTerritory2Filter=false.
      * If territory2Id = null in result map, clear the opportunity.territory2Id if set.
      * If opportunity is not present in result map, its territory2Id remains intact.
      */
    global Map<Id,Id> getOpportunityTerritory2Assignments(List<Id> opportunityIds) { 
        Map<Id, Id> OppIdTerritoryIdResult = new Map<Id, Id>();

        // Get the active territory model Id
        Id activeModelId = getActiveModelId();

        if(activeModelId != null){
            List<Opportunity> opportunities =
              [Select Id, AccountId, Territory2Id from Opportunity where Id IN :opportunityIds];
            Set<Id> accountIds = new Set<Id>();
            // Create set of parent accountIds
            for(Opportunity opp:opportunities){
                if(opp.AccountId != null){
                    accountIds.add(opp.AccountId);
                    }
                }

                Map<Id,Territory2Priority> accountMaxPriorityTerritory = getAccountMaxPriorityTerritory(activeModelId, accountIds);

            // For each opportunity, assign the highest priority territory if there is no conflict, else assign null.
            for(Opportunity opp: opportunities){
               Territory2Priority tp = accountMaxPriorityTerritory.get(opp.AccountId);
               // Assign highest priority territory if there is only 1.
              if((tp != null) && (tp.moreTerritoriesAtPriority == false) && (tp.territory2Id != opp.Territory2Id)){
                   OppIdTerritoryIdResult.put(opp.Id, tp.territory2Id);
               }else{
                   OppIdTerritoryIdResult.put(opp.Id, null);
               }
            }
        }
        return OppIdTerritoryIdResult;
    }
    
    /**
      * Query assigned territoryIds in active model for given accountIds.
      * Create a map of accountId to max priority territory.
      */
     private Map<Id,Territory2Priority> getAccountMaxPriorityTerritory(Id activeModelId, Set<Id> accountIds){
        Map<Id,Territory2Priority> accountMaxPriorityTerritory = new Map<Id,Territory2Priority>();
        for(ObjectTerritory2Association ota:[Select ObjectId, Territory2Id, Territory2.Territory2Type.Priority from ObjectTerritory2Association where objectId IN :accountIds and Territory2.Territory2ModelId = :activeModelId]){
            Territory2Priority tp = accountMaxPriorityTerritory.get(ota.ObjectId);

            if((tp == null) || (ota.Territory2.Territory2Type.Priority > tp.priority)){
                // If this is the first territory examined for account or it has greater priority than current highest priority territory, then set this as new highest priority territory.
                tp = new Territory2Priority(ota.Territory2Id,ota.Territory2.Territory2Type.priority,false);
            }else if(ota.Territory2.Territory2Type.priority == tp.priority){
                // The priority of current highest territory is same as this, so set moreTerritoriesAtPriority to indicate multiple highest priority territories seen so far.
                tp.moreTerritoriesAtPriority = true;
            }
            
            accountMaxPriorityTerritory.put(ota.ObjectId, tp);
        }
        return accountMaxPriorityTerritory;
    }


    /**
     * Get the Id of the Active Territory Model.
     * If none exists, return null.
     */
    private Id getActiveModelId() {
        List<Territory2Model> models = [Select Id from Territory2Model where State = 'Active'];
        Id activeModelId = null;
        if(models.size() == 1){
            activeModelId = models.get(0).Id;
        }

        return activeModelId;
    }

    /**
    * Helper class to help capture territory2Id, its priority, and whether there are more territories with same priority assigned to the account.
    */
    @testVisible
    private class Territory2Priority {
        public Id territory2Id { get; set; }
        public Integer priority { get; set; }
        public Boolean moreTerritoriesAtPriority { get; set; }

        @testVisible
        Territory2Priority(Id territory2Id, Integer priority, Boolean moreTerritoriesAtPriority){
            this.territory2Id = territory2Id;
            this.priority = priority;
            this.moreTerritoriesAtPriority = moreTerritoriesAtPriority;
        }
    }
}

I had found a test class here for this:
@isTest
private class OppTerrAssignDefaultLogicFilterTest {
    
    @isTest
    private static void testActiveModel() {
        // This method is just for code coverage. You can't activate a territory model from code.
        OppTerrAssignDefaultLogicFilter filter = new OppTerrAssignDefaultLogicFilter();
        Id modelId = filter.ActiveModelId;
    }
    
    @isTest
    private static void testOppTerritory() {
        Territory2 terr = new Territory2();
        Territory2 terr2 = new Territory2();
        OppTerrAssignDefaultLogicFilter filter = new OppTerrAssignDefaultLogicFilter();
        
        System.runAs(new User(Id = UserInfo.getUserId())) {
            Territory2Model tm = new Territory2Model(Name = 'test', DeveloperName ='test');
            insert tm;
            
            filter.ActiveModelId = tm.Id; //set the active model Id since it can't be queried
            
            Territory2Type tt = [Select Id from Territory2Type limit 1];
            
            terr = new Territory2(Name = 'Test Territory', DeveloperName = 'TestTerritory', Territory2ModelId = tm.Id, Territory2TypeId = tt.Id);
            insert terr;
            
            terr2 = new Territory2(Name = 'Test Territory2', DeveloperName = 'TestTerritory2', Territory2ModelId = tm.Id, Territory2TypeId = tt.Id);
            insert terr2;
        }
        
        Account a = new Account(Name = 'Test Account');
        insert a;
        
		Contact testContact = new Contact(
                FirstName = 'First',
                LastName = 'Last',
                Email = 'test@test.com',
                AccountId = a.Id
        );
        insert testContact;        
        
        ObjectTerritory2Association ota = new ObjectTerritory2Association(AssociationCause  = 'Territory2Manual', ObjectId = a.Id, Territory2Id = terr.Id);
        insert ota;
        
        Opportunity opp = new Opportunity(
                Name = 'Test Opp',
                AccountId = a.Id,
                //RecordTypeId = String.isNotBlank(oppRecTypeId) ? oppRecTypeId : null,
                StageName = 'Prospecting',
                OpportunityContact__c = testContact.Id,
                Type = 'Systems',
                CloseDate = System.today(),
                Market_Segment__c = 'General Industry',
                End_User_Type__c = 'Agricultural'
        );
        insert opp;   
        
                
        Map<Id, Id> resultMap = filter.getOpportunityTerritory2Assignments(new List<Id>{opp.Id});
        
        System.assertEquals(terr.Id, resultMap.get(opp.Id));
        
        ObjectTerritory2Association ota2 = new ObjectTerritory2Association(AssociationCause  = 'Territory2Manual', ObjectId = a.Id, Territory2Id = terr2.Id);
        insert ota2;
        
        resultMap = filter.getOpportunityTerritory2Assignments(new List<Id>{opp.Id});
        
        System.assertEquals(null, resultMap.get(opp.Id), 'No territory should be assinged as 2 have the same priority');
    }
    
}

I am getting an error at lines 8 and 20 on the test class that states:
Variable does not exist: ActiveModelId

Can anyone advise as to how to resolve?

Many Thanks!