Google adds

Merge More Than 2 Record

global class BatchMergeSubscription implements Database.Batchable<sObject>{
   
    global Database.QueryLocator start(Database.BatchableContext BC){
        String query = 'select id, OrderApi__Contact__r.Name, OrderApi__Status__c, OrderApi__Item__r.Name, OrderApi__Subscription_Plan__r.Name, OrderApi__Current_Term_Start_Date__c, OrderApi__Current_Term_End_Date__c, OrderApi__Subscription_Dues_Total__c from OrderApi__Subscription__c';      
        return Database.getQueryLocator(query);
    }
   
    global void execute(Database.BatchableContext BC, List<OrderApi__Subscription__c > subList){
        Map<String, OrderApi__Subscription__c> mapSub = new Map<String, OrderApi__Subscription__c>();
        List<OrderApi__Subscription__c> toDeleteSub = new List<OrderApi__Subscription__c>();
        String condition = '';
        for(OrderApi__Subscription__c sub : subList){
            condition = '' + sub.OrderApi__Contact__r.Name + ' ' + sub.OrderApi__Status__c + ' ' + sub.OrderApi__Item__r.Name + ' ' + sub.OrderApi__Subscription_Plan__r.Name;
           
            //Checking subscriptions based on above conditions
            if(mapSub.containsKey(condition)){
                OrderApi__Subscription__c chk = mapSub.get(condition);
               
                //Checking subscriptions based on Start Date
                if(sub.OrderApi__Current_Term_Start_Date__c == chk.OrderApi__Current_Term_Start_Date__c){
                   
                    //Checking subscriptions based on the total dues
                    //if dues are equals delete the sub record
                    if(sub.OrderApi__Subscription_Dues_Total__c == chk.OrderApi__Subscription_Dues_Total__c){
                        toDeleteSub.add(sub);  
                    }else{
                        //if dues are not equal compare sub's dues with the chk's dues
                        //if sub's dues > chk's dues
                        //delete chk's dues
                        if(sub.OrderApi__Subscription_Dues_Total__c > chk.OrderApi__Subscription_Dues_Total__c){                          
                            mapSub.put(condition, sub);
                            toDeleteSub.add(chk);
                        }//else delete sub's dues                          
                        else{
                            toDeleteSub.add(sub);  
                        }
                    }                  
                }//if Start date are not equals than compare the start dates
                else{
                    //if sub.startdate > chk.startdate
                    //delete chk.startdate
                    //Calculate days of lapse and add all
                    Integer totalDays = 0;
                    if(sub.OrderApi__Current_Term_Start_Date__c > chk.OrderApi__Current_Term_Start_Date__c){
                       
                        totalDays = (Integer)(sub.OrderApi__Days_To_Lapse__c + chk.OrderApi__Days_To_Lapse__c);
                        Date d = sub.OrderApi__Current_Term_End_Date__c;
                        sub.OrderApi__Current_Term_End_Date__c = d.addDays(totalDays);
                       
                        mapSub.put(condition, sub);
                        toDeleteSub.add(chk);
                    }//else delete sub.startdate
                    else{
                       
                        totalDays = (Integer)(sub.OrderApi__Days_To_Lapse__c + chk.OrderApi__Days_To_Lapse__c);
                        Date d = sub.OrderApi__Current_Term_End_Date__c;
                        chk.OrderApi__Current_Term_End_Date__c = d.addDays(totalDays);                      
                       
                        mapSub.put(condition, chk);
                        toDeleteSub.add(sub);
                    }
                }              
               
            }else{  //if conditions doesn't exists than add the conditions            
                mapSub.put(condition, sub);
            }
        }
       
        if(toDeleteSub.size()>0){
            System.debug('To Delete');
            for(OrderApi__Subscription__c sub : toDeletesub){
                System.debug('Subscription to deleted : ' + sub);
            }
            delete toDeleteSub;
        }
    }
   
    global void finish(Database.BatchableContext BC){
       
    }  
}

No comments:

Post a Comment

All Governor Limit

Number of SOQL queries: 100 Number of query rows: 50,000 Number of SOSL queries: 20 Number of DML statements: 150 Number of DML rows: 10,...