Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
public with sharing class OpportunityTriggerHandler {

public static void run(List<Opportunity> newList, Map<Id, Opportunity> oldMap) {
if (Trigger.isBefore) {
OpportunityValidationService.validateStageProbability(newList);
OpportunityValidationService.validateDiscount(newList);
}
}
}
18 changes: 18 additions & 0 deletions force-app/main/default/classes/OpportunityValidationService.cls
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
public with sharing class OpportunityValidationService {

public static void validateStageProbability(List<Opportunity> opps) {
for (Opportunity opp : opps) {
if (opp.StageName == 'Closed Won' && opp.Probability < 100) {
opp.addError('Probability must be 100% when Stage is Closed Won.');
}
}
}

public static void validateDiscount(List<Opportunity> opps) {
for (Opportunity opp : opps) {
if (opp.Discount__c != null && opp.Discount__c > 50) {
opp.addError('Discount cannot exceed 50%.');
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
@isTest
private class OpportunityValidationServiceTest {

@isTest
static void testInvalidStageProbability() {
Opportunity opp = new Opportunity(
Name = 'Test Opp',
StageName = 'Closed Won',
Probability = 80,
CloseDate = Date.today()
);

Test.startTest();
Database.SaveResult sr = Database.insert(opp, false);
Test.stopTest();

System.assert(!sr.isSuccess());
}

@isTest
static void testInvalidDiscount() {
Opportunity opp = new Opportunity(
Name = 'Discount Test',
StageName = 'Prospecting',
Probability = 10,
Discount__c = 60,
CloseDate = Date.today()
);

Test.startTest();
Database.SaveResult sr = Database.insert(opp, false);
Test.stopTest();

System.assert(!sr.isSuccess());
}

@isTest
static void testValidOpportunity() {
Opportunity opp = new Opportunity(
Name = 'Valid Opp',
StageName = 'Prospecting',
Probability = 10,
Discount__c = 20,
CloseDate = Date.today()
);

Test.startTest();
insert opp;
Test.stopTest();

System.assertNotEquals(null, opp.Id);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
public class OpportunityValidationException extends ValidationException {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>59.0</apiVersion>
<status>Active</status>
</ApexClass>

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
public class ValidationException extends Exception {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<ApexClass xmlns="http://soap.sforce.com/2006/04/metadata">
<apiVersion>59.0</apiVersion>
<status>Active</status>
</ApexClass>
3 changes: 3 additions & 0 deletions force-app/main/default/triggers/OpportunityTrigger.trigger
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
trigger OpportunityTrigger on Opportunity (before insert, before update) {
OpportunityTriggerHandler.run(Trigger.new, Trigger.oldMap);
}