You need to sign in to do that
Don't have an account?
Ashu sharma 38
How to prevent from overlap the Dates with unique field values
Hi,
I have a requirement,in a object i have to restrict for crearting records on below case:
Suppose I have created a records and on custom field(Test_code__c) I have put value:"ABC",and start date-->29/11/2019
End date:->29/12/2019
So in next records if I tried to create the record with same value 'ABC',the Start date and End should not be overlaped.
I have a requirement,in a object i have to restrict for crearting records on below case:
Suppose I have created a records and on custom field(Test_code__c) I have put value:"ABC",and start date-->29/11/2019
End date:->29/12/2019
So in next records if I tried to create the record with same value 'ABC',the Start date and End should not be overlaped.
I'm using as example the Contact Object and I'm using the LastName as "Test_code__c" you referred. Also, I created two custom fields for the Contact call Start_Date__c, End_Date__c. The idea is create a before Trigger for handle what you want.
I hope this can help you!
All Answers
I'm using as example the Contact Object and I'm using the LastName as "Test_code__c" you referred. Also, I created two custom fields for the Contact call Start_Date__c, End_Date__c. The idea is create a before Trigger for handle what you want.
I hope this can help you!
Thanks It works fine for me!!!!
how to write Test class for above code.
Thanks
You would then perhaps find previous posts like this one:
https://developer.salesforce.com/forums/ForumsMain?id=9062I000000IKZPQA4
Its works but I am not getting full code coverage on trigger.new add error.(80% code coverage)
and one thing in test class u have written in boolean :
Boolean expectedExceptionThrown = (e.getMessage().contains('You cannot overlap dates in same Contact')) ? true : false;
so can u explain me why u have written ? true : false
Thanks
Basically when we are using "addError" function to code will fire an exception, if we don't handle that exception the test won't pass. However, to make sure the exception is the error message we had on the "addError" part, we are using a flag setting it true if the message we get in the exception is 'You cannot overlap dates in same Contact'.
As I am activate both my trigger and Process builder but getting error.
in my process builder I have update the status picklist field based on comparsion on current date,startDate,end date.
Any suggestions.
I am getting 70% code coverage.
@isTest
private class StartEnddateOverlapPreventionHandlerTest {
@isTest static void partnerSaleTermTriggerHandlerTest(){
Boolean exceptionThrown = false;
Partner_Sales_Term__c pst1=new Partner_Sales_Term__c();
pst1.Partner_Code__c='ABC';
pst1.Sales_Cycle_Start_Date__c=Date.newInstance(2019, 12, 2);
pst1.Sales_Cycle_End_Date__c=Date.newInstance(2019, 12, 12);
insert pst1;
try{
Partner_Sales_Term__c pst2=new Partner_Sales_Term__c();
pst2.Partner_Code__c = 'ABC';
pst2.Sales_Cycle_Start_Date__c = Date.newInstance(2019, 11, 18);
pst2.Sales_Cycle_End_Date__c = Date.newInstance(2019, 11, 26);
insert pst2;
}catch(Exception e){
exceptionThrown = true;
Boolean expectedExceptionThrown = (e.getMessage().contains('You cannot overlap dates in same Partner Code')) ;
System.AssertEquals(true, expectedExceptionThrown, e.getMessage());
system.assertEquals(true, expectedExceptionThrown);
}
}
}
and my class
public class StartEnddateOverlapPreventionHandler {
public static Boolean isFirstTime = true;
public static void StartEnddateOverlapPreventionMethod(list<Partner_Sales_Term__c> newPartenerSaleTermData){
// List <Partner_Sales_Term__c> newPartenerSaleTermData = Trigger.new; //Getting data of the current record that will be add
if(newPartenerSaleTermData!=null && !newPartenerSaleTermData.isEmpty() && isFirstTime==true){
set<string> partnerCodeSet=new set<string>();
if(trigger.isInsert){
isFirstTime=false;
}
for(Partner_Sales_Term__c ps:newPartenerSaleTermData){
partnerCodeSet.add(ps.Partner_Code__c);
}
if(!partnerCodeSet.isEmpty())
{
List <Partner_Sales_Term__c> partnerCodewitSamePartnerCode = [Select Id, name,Partner_Code__c, Sales_Cycle_Start_Date__c, Sales_Cycle_End_Date__c FROM Partner_Sales_Term__c WHERE Partner_Code__c IN: partnerCodeSet];
if( !partnerCodewitSamePartnerCode.isEmpty() && partnerCodewitSamePartnerCode!=null){
for(Partner_Sales_Term__c ps:newPartenerSaleTermData){
for(Partner_Sales_Term__c samePSCode :partnerCodewitSamePartnerCode){
system.debug('@@@startDate ' +samePSCode.Sales_Cycle_Start_Date__c);
system.debug('@@@end Date ' +samePSCode.Sales_Cycle_End_Date__c);
if(ps.Sales_Cycle_End_Date__c >=samePSCode.Sales_Cycle_Start_Date__c && ps.Sales_Cycle_Start_Date__c<=samePSCode.Sales_Cycle_End_Date__c){
ps.addError('You cannot overlap dates in same Partner Code');
}
}
}
}
}
}
}
}
Yes I am using handler class for this.
newPartenerSaleTermData:trigger.new
as 73% code coverage I am getting.
public class StartEnddateOverlapPreventionHandler {
public static Boolean isFirstTime = true;
public static void StartEnddateOverlapPreventionMethod(list<Partner_Sales_Term__c> newPartenerSaleTermData){
// List <Partner_Sales_Term__c> newPartenerSaleTermData = Trigger.new; //Getting data of the current record that will be add
if(newPartenerSaleTermData!=null && !newPartenerSaleTermData.isEmpty() && isFirstTime==true){
set<string> partnerCodeSet=new set<string>();
if(trigger.isInsert){
isFirstTime=false;
}
for(Partner_Sales_Term__c ps:newPartenerSaleTermData){
partnerCodeSet.add(ps.Partner_Code__c);
}
if(!partnerCodeSet.isEmpty())
{
List <Partner_Sales_Term__c> partnerCodewitSamePartnerCode = [Select Id, name,Partner_Code__c, Sales_Cycle_Start_Date__c, Sales_Cycle_End_Date__c FROM Partner_Sales_Term__c WHERE Partner_Code__c IN: partnerCodeSet];
if( !partnerCodewitSamePartnerCode.isEmpty() && partnerCodewitSamePartnerCode!=null){
for(Partner_Sales_Term__c ps:newPartenerSaleTermData){
for(Partner_Sales_Term__c samePSCode :partnerCodewitSamePartnerCode){
system.debug('@@@startDate ' +samePSCode.Sales_Cycle_Start_Date__c);
system.debug('@@@end Date ' +samePSCode.Sales_Cycle_End_Date__c);
if(ps.Sales_Cycle_End_Date__c >=samePSCode.Sales_Cycle_Start_Date__c && ps.Sales_Cycle_Start_Date__c<=samePSCode.Sales_Cycle_End_Date__c){
ps.addError('You cannot overlap dates in same Partner Code');
}
}
}
}
}
}
}
}
=========
@isTest
private class StartEnddateOverlapPreventionHandlerTest {
@isTest static void partnerSaleTermTriggerHandlerTest(){
Boolean exceptionThrown = false;
Partner_Sales_Term__c pst1=new Partner_Sales_Term__c();
pst1.Partner_Code__c='ABC';
pst1.Sales_Cycle_Start_Date__c=Date.newInstance(2019, 12, 2);
pst1.Sales_Cycle_End_Date__c=Date.newInstance(2019, 12, 12);
insert pst1;
try{
Partner_Sales_Term__c pst2=new Partner_Sales_Term__c();
pst2.Partner_Code__c = 'ABC';
pst2.Sales_Cycle_Start_Date__c = Date.newInstance(2019, 11, 18);
pst2.Sales_Cycle_End_Date__c = Date.newInstance(2019, 11, 26);
insert pst2;
}catch(Exception e){
exceptionThrown = true;
Boolean expectedExceptionThrown = (e.getMessage().contains('You cannot overlap dates in same Partner Code')) ;
System.AssertEquals(true, expectedExceptionThrown, e.getMessage());
system.assertEquals(true, expectedExceptionThrown);
}
}
}
//Trigger Handler
trigger StartEnddateOverlapPrevention on Partner_Sales_Term__c (before insert,before update) {
if( Trigger.isBefore && (Trigger.isInsert ||Trigger.isUpdate ) ){
StartEnddateOverlapPreventionHandler.StartEnddateOverlapPreventionMethod(trigger.new);
}
}
As not able to complete the above code coverage.
Thanks..
You can insert this code by Anonymous Window (Debug/Open Execute Anonymous Window):
and then you can run this test class:
A test class doesn't consider the data at the org unless we use "SeeAllData=true" on it. However, in this case our SOQL at "partnerCodewitSamePartnerCode" list is returning an empty list, what we are going to do is insert a real data by Anonymous Window and then inserting a record from test class that provoke the exception and showing the message 'You cannot overlap dates in same Partner Code'. For deploy, you can include in your test class a Partner_Code__c from a real record and a range of Sales Cycle data related to that real code.
This was very hard to solve, I hope it helps you!
I tried the above code with similar requirement but in my case even if one record exists with the same combination its throwing an error. Basically, it should prevent only if with same id same name data overlapping should happen. Could yu please help me with this