V1 Simple Merge Transfer contacts and opportunities to merged account..

public class MergeAccWorkshop {
    public void CreateAccContOp(String compName, Integer howManyWorkers, String fName,String lName){
        Account newAcc = New Account(Name=compName);
        insert newAcc;
        
        List<Contact> multiContact = New List<Contact>();
        
        for(Integer workers=1;workers<=howManyWorkers;workers++){
            Contact newCon = New Contact();
            newCon.firstName = fName + ' ' + workers;
            newCon.lastName= lName + ' ' + workers; 
            newCon.AccountId= newAcc.id;
            multiContact.add(newCon);
        }
        
        insert multiContact;
        
        
        List<Opportunity> multiOp = New List<Opportunity>();
        
        for(Integer opp=1;opp<=10;opp++){
            Opportunity newOp = New Opportunity();
            newOp.Name = compName+ ' ' + opp;
            newOp.CloseDate= date.TODAY()+(opp*15);
            newOp.StageName = 'Value Proposition';
            newOp.AccountId = newAcc.id;
            multiOp.add(newOp);
        }
        insert multiOp;
        
    }
    
   
    public void deleteAccContOp(String DeleteAccName, String DeleteContactName){
        
        String workersName = '%' + DeleteContactName + '%';
        
        List<Contact> contactDelete = [SELECT Id 
                               FROM Contact 
                               WHERE Name LIKE :workersName];

		Delete contactDelete;
        
        
        String opName = '%' +DeleteAccName+ '%';
        List<Opportunity> deleteOp  =[SELECT Id 
                                     FROM Opportunity
                                     WHERE Name LIKE :opName];
        
        List<Account> deleteAcc = [SELECT Id 
                          FROM Account
                          WHERE Name =:DeleteAccName];

		delete deleteAcc;
        
    }
    
    
}
// Scenario Prep. 
// Account record create Online İhracat
/*
MergeAccWorkshop onlineIhracat = New MergeAccWorkshop();
onlineIhracat.CreateAccContOp('Online İhracat', 20, 'Online İhracat','Çalışan');

// Account record create Dream Solution
MergeAccWorkshop dreamSolution = New MergeAccWorkshop();
dreamSolution.CreateAccContOp('Dream Solution', 10, 'Dream Solution','Çalışan');

*/

// combine 2 company
// Dream Solution aquire  Online İhracat. 
// All of the contacts and opportunities must be transferred to the Dream Solution

/*

Account dreamSolution = [SELECT id, Name 
                         FROM Account
                        WHERE Name = 'Dream Solution'];

Account onlineIhracat = [SELECT id, Name 
                         FROM Account
                        WHERE Name = 'Online İhracat'];

merge dreamSolution onlineIhracat;

*/

// Clear the dummy data to test again.

/*
MergeAccWorkshop companyAndWorker = New MergeAccWorkshop();
companyAndWorker.deleteAccContOp('Dream Solution','Çalışan');
companyAndWorker.deleteAccContOp('Online İhracat','Çalışan');

*/

V2 When Combining the Accounts Calculate new Annual revenue

We add our class Annual revenue fields also.

public class MergeAccWorkshop {
    public void CreateAccContOp(String compName, Integer howManyWorkers, String fName,String lName,Integer Revenue){
        Account newAcc = New Account(Name=compName,AnnualRevenue=Revenue);
        insert newAcc;
        
        List<Contact> multiContact = New List<Contact>();
        
        for(Integer workers=1;workers<=howManyWorkers;workers++){
            Contact newCon = New Contact();
            newCon.firstName = fName + ' ' + workers;
            newCon.lastName= lName + ' ' + workers; 
            newCon.AccountId= newAcc.id;
            
            multiContact.add(newCon);
        }
        
        insert multiContact;
        
        
        List<Opportunity> multiOp = New List<Opportunity>();
        
        for(Integer opp=1;opp<=10;opp++){
            Opportunity newOp = New Opportunity();
            newOp.Name = compName+ ' ' + opp;
            newOp.CloseDate= date.TODAY()+(opp*15);
            newOp.StageName = 'Value Proposition';
            newOp.AccountId = newAcc.id;
            multiOp.add(newOp);
        }
        insert multiOp;
        
    }
    
   
    public void deleteAccContOp(String DeleteAccName, String DeleteContactName){
        
        String workersName = '%' + DeleteContactName + '%';
        
        List<Contact> contactDelete = [SELECT Id 
                               FROM Contact 
                               WHERE Name LIKE :workersName];

		Delete contactDelete;
        
        
        String opName = '%' +DeleteAccName+ '%';
        List<Opportunity> deleteOp  =[SELECT Id 
                                     FROM Opportunity
                                     WHERE Name LIKE :opName];
        
        List<Account> deleteAcc = [SELECT Id 
                          FROM Account
                          WHERE Name =:DeleteAccName];

		delete deleteAcc;
        
    }
    
    
}
// Scenario Prep. 
// Account record create Online İhracat
/*
MergeAccWorkshop onlineIhracat = New MergeAccWorkshop();
onlineIhracat.CreateAccContOp('Online İhracat', 20, 'Online İhracat','Çalışan',100000);

// Account record create  Dream Solution
MergeAccWorkshop dreamSolution = New MergeAccWorkshop();
dreamSolution.CreateAccContOp('Dream Solution', 10, 'Dream Solution','Çalışan',200000);

*/

// combine 2 company
// Dream Solution aquire  Online İhracat. 
// All of the contacts and opportunities must be transferred to the Dream Solution
// Also both companies annualrevenue must be combined. 

Account dreamSolution = [SELECT id, Name, AnnualRevenue 
                         FROM Account
                        WHERE Name = 'Dream Solution'];

Account onlineIhracat = [SELECT id, Name , AnnualRevenue
                         FROM Account
                        WHERE Name = 'Online İhracat'];

System.debug(dreamSolution);

system.debug(onlineIhracat);

// Before merge get some of the values from the merged account.

Decimal totalAnnualRevenue = dreamSolution.AnnualRevenue+ onlineIhracat.AnnualRevenue;

dreamSolution.AnnualRevenue=totalAnnualRevenue;

update dreamSolution;

// merge the contacts and opportunities 

merge dreamSolution onlineIhracat;

dreamSolution = [SELECT id, Name, AnnualRevenue 
                         FROM Account
                        WHERE Name = 'Dream Solution'];
system.debug('Merged account :' + dreamSolution);

// Clear dummy data to test your codes again...

/*
MergeAccWorkshop companyAndWorker = New MergeAccWorkshop();
companyAndWorker.deleteAccContOp('Dream Solution','Çalışan');
companyAndWorker.deleteAccContOp('Online İhracat','Çalışan');

*/