Apex: Clone a record, then make the new record the Parent of the old cloned Record
public static void cloneTransferCases(Map<Id,Case> oldMap,List<Case> newList){
System.debug('MM++++ oldMap: ' + oldMap.keySet());
System.debug('MM++++ oldMap Values: ' + oldMap.values());
System.debug('MM++++ newList: ' + newList);
Set<id> processedAbandonCloneRecords = new Set<Id>();
Map<Id,Case> mapCaseToInsert = new Map<Id,Case>();
for(Case cs : newList){
// check to see if this record has been processed already in this transaction
if(!processedAbandonCloneRecords.contains(cs.Id)){
if(cs.Status == 'Abandoned'){
if(cs.Abandoned_Reason__c == 'Transferred' && oldMap.get(cs.Id).Abandoned_Reason__c != 'Transferred'){
if(cs.Transfer_To__c != null && cs.ParentId == null){
// Create a temporary case using oldMap
// to get field values prior to Abandonment
Case tempCase = oldMap.get(cs.Id).clone();
// set owner of new case to match the Transfer To user
tempCase.OwnerId = cs.Transfer_To__c;
tempCase.ParentId = null;
mapCaseToInsert.put(cs.id,tempCase);
// mark this record as processed in this transaction
processedAbandonCloneRecords.add(cs.Id);
// if we are running tests, insert and update will
// occur in same transaction so we should actually
// not stop cascade
if(Test.isRunningTest()){
processedAbandonCloneRecords.remove(cs.Id);
}
}
}
}
}
}
if(!mapCaseToInsert.isEmpty()){
insert mapCaseToInsert.values();
}
for(Case cs : newList){
if(mapCaseToInsert.containsKey(cs.id)) {
cs.ParentId = mapCaseToInsert.get(cs.id).id;
}
}
}