Development questions
Prevent a user from changing an Opportunity's StageName backwards (e.g., from Negotiation/Review back to Prospecting) unless their Profile is System Administrator.
Use before update, define stage order, and bypass for System Administrators.
apex
trigger OppTrigger on Opportunity (before update) {
List<String> order = new List<String>{'Prospecting','Qualification','Negotiation/Review','Closed Won'};
Boolean isAdmin = [SELECT Name FROM Profile WHERE Id = :UserInfo.getProfileId()].Name == 'System Administrator';
if (isAdmin) return;
for (Opportunity o : Trigger.new) {
Integer newIdx = order.indexOf(o.StageName);
Integer oldIdx = order.indexOf(Trigger.oldMap.get(o.Id).StageName);
if (newIdx >= 0 && oldIdx >= 0 && newIdx < oldIdx) {
o.StageName.addError('You cannot move the stage backwards.');
}
}
}
A custom permission or validation rule with PRIORVALUE is a more declarative alternative.
apex-triggertriggercodingscenariovalidation
More Development questions
- What is an Apex Trigger in Salesforce and when should you use it over Flows?
- What is the difference between before triggers and after triggers?
- Explain all Trigger context variables (isInsert, isUpdate, isDelete, isUndelete, isBefore, isAfter, isExecuting, size, operationType).
- What is the difference between Trigger.new and Trigger.old?
- In which trigger events are Trigger.new and Trigger.newMap available?
- In which trigger events are Trigger.old and Trigger.oldMap available?