Skip to main content
I am playing with Territory Management and getting this error Your request to run opportunity territory assignment filter for Test Model has failed. Please try again. while trying the Run Opportunities Filter. I tried already in 2 dev orgs without success.  Here are my Territory Settings:

 

Can't run Opportunities Filter for Territory Management

 

Here is the Territory Model:

 

Territory Model

 

What Am I missing?

 

Thanks
3 respuestas
  1. 6 nov 2019, 14:52
    I am pretty sure is the APEX, however, this is the code provided by Salesforce on their documentation and I am not a developer.

     

    Here is the code:

     

    /*** 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.

     

        */

     

        private class Territory2Priority {

     

            public Id territory2Id { get; set; }

     

            public Integer priority { get; set; }

     

            public Boolean moreTerritoriesAtPriority { get; set; }

     

            Territory2Priority(Id territory2Id, Integer priority, Boolean moreTerritoriesAtPriority){

     

                this.territory2Id = territory2Id;

     

                this.priority = priority;

     

                this.moreTerritoriesAtPriority = moreTerritoriesAtPriority;

     

            }

     

        }

     

    }

     

     
0/9000