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.

DevelopmentMediumDeloittePwCCapgemini

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