Guest User

Untitled

a guest
Jan 9th, 2019
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.43 KB | None | 0 0
  1. global class PrepareSandboxPostCopy_Batch implements Database.Batchable<sObject> {
  2.  
  3. String query;
  4. String sObjectName;
  5. Map <String, List <String>> sObjectEmaiLFieldsMap = new Map <String, List <String>>();
  6.  
  7. //Call this method from the class that implements the SandboxPostCopy Interface or from Developer console
  8. global static void executeBatch() {
  9. Map <String, List <String>> sObjectEmaiLFieldsMap = getsObjectEmaiLFields();
  10.  
  11. if(!sObjectEmaiLFieldsMap.isEmpty()) {
  12. Database.executeBatch(new PrepareSandboxPostCopy_Batch(sObjectEmaiLFieldsMap));
  13. }
  14. }
  15.  
  16. /** BATCHABLE INTERFACE IMPLEMENTATION STARTS **/
  17. global PrepareSandboxPostCopy_Batch(Map <String, List <String>> sObjectFieldsMap) {
  18. //Get First Key In Map
  19. sObjectName = new List<String> (sObjectFieldsMap.keySet()).get(0);
  20.  
  21. sObjectEmaiLFieldsMap = sObjectFieldsMap;
  22. query = getSOQLString(sObjectName, sObjectEmaiLFieldsMap.get(sObjectName));
  23. }
  24.  
  25. global Database.QueryLocator start(Database.BatchableContext BC) {
  26. return Database.getQueryLocator(query);
  27. }
  28.  
  29. global void execute(Database.BatchableContext BC, List<sObject> scope) {
  30.  
  31. for(sObject thisRecord : scope) {
  32. for(String thisField : sObjectEmaiLFieldsMap.get(sObjectName)) {
  33. String email = (String) thisRecord.get(thisField);
  34. if(String.isEmpty(email) || email.contains('.invalid') || email.contains('.noemail')) continue; //If empty or if contains .invalid then do not update
  35. thisRecord.put(thisField, email + '.invalid'); //Append invalid to the email
  36. }
  37. }
  38. Database.update(scope, false); //allow partial success
  39. }
  40.  
  41. global void finish(Database.BatchableContext BC) {
  42. //Remove the sObject (First Key) once the records for the sObject processed successfully
  43. sObjectEmaiLFieldsMap.remove(sObjectName);
  44. executeBatch(sObjectEmaiLFieldsMap);
  45. }
  46. /** BATCHABLE INTERFACE IMPLEMENTATION ENDS **/
  47.  
  48. public static Boolean isSandbox() {
  49. return [SELECT IsSandbox FROM Organization WHERE Id =: UserInfo.getOrganizationId()].IsSandbox;
  50. }
  51.  
  52. private static void executeBatch(Map <String, List <String>> sObjectFieldsMap) {
  53. if(!sObjectFieldsMap.isEmpty()) {
  54. Database.executeBatch(new PrepareSandboxPostCopy_Batch(sObjectFieldsMap));
  55. }
  56. }
  57.  
  58. private static String getSOQLString(String sObjectName, List<String> sObjectFields) {
  59.  
  60. String soqlQuery = 'SELECT {!sObjectFields} FROM {!objectTypeName} WHERE {!conditionals}';
  61.  
  62. List<String> conditionals = new List <String>();
  63. for (String thisField: sObjectFields) {
  64. conditionals.add(thisField + ' != NULL');
  65. }
  66.  
  67. soqlQuery = soqlQuery.replace('{!sObjectFields}', String.join(sObjectFields, ' ,'));
  68. soqlQuery = soqlQuery.replace('{!objectTypeName}', sObjectName);
  69. soqlQuery = soqlQuery.replace('{!conditionals}', String.join(conditionals, ' OR '));
  70.  
  71. if(!isSandbox()) soqlQuery = soqlQuery + ' LIMIT 0'; //For Non Sandbox (Production) Instance Do Not Update Records
  72.  
  73. return soqlQuery;
  74. }
  75.  
  76. //Get all Queryable Objects and it's email fields
  77. private static Map <String, List <String>> getsObjectEmaiLFields() {
  78.  
  79. Map <String, List <String>> sObjectEmailFieldMap = new Map <String, List <String>>();
  80.  
  81. //Only pass the selected object, dynamically getting all objects may exceed APEX CPU Limit
  82. List<SObjectType> sObjectsToUpdate = new List<SObjectType>{ Account.SObjectType,
  83. Contact.SObjectType,
  84. Case.SObjectType,
  85. CampaignMember.SObjectType,
  86. Lead.SObjectType,
  87. Opportunity.SObjectType,
  88. Quote.SObjectType };
  89.  
  90. for(SObjectType sObjectType : sObjectsToUpdate) {
  91.  
  92. //Describe sObject
  93. DescribeSObjectResult sObjectDescribe = sObjectType.getDescribe();
  94.  
  95. String objectTypeName = sObjectDescribe.getName();
  96.  
  97. //Skip objects we cannot query or update
  98. if(!sObjectDescribe.isQueryable() || !sObjectDescribe.isUpdateable()) continue;
  99.  
  100. for(SObjectField sObjectField: sObjectDescribe.fields.getMap().values()) {
  101.  
  102. DescribeFieldResult thisField = sObjectField.getDescribe();
  103.  
  104. //Skip all non email fields
  105. if(thisField.getType() != Schema.DisplayType.EMAIL || !thisField.isFilterable() || !thisField.isUpdateable()) continue;
  106.  
  107. if(sObjectEmailFieldMap.containsKey(objectTypeName)) {
  108. sObjectEmailFieldMap.get(objectTypeName).add(thisField.getName());
  109. }
  110. else {
  111. sObjectEmailFieldMap.put(objectTypeName, new List <String> {thisField.getName()});
  112. }
  113. }
  114. }
  115. return sObjectEmailFieldMap;
  116. }
  117. }
  118.  
  119. @isTest
  120. private class SandboxPostRefreshTestCase {
  121.  
  122. static Map <String, List <String>> sObjectEmailFieldMap;
  123.  
  124. static Testmethod void testSandboxPostCopyScript() {
  125. sObjectEmailFieldMap = New Map <String, List <String>>();
  126. Account accVar = new Account();
  127. accVar.Name ='Account Test';
  128. INSERT accVar;
  129.  
  130. Contact conVar = new Contact();
  131. conVar.LastName ='Contact Test';
  132. conVar.AccountId =accVar.Id;
  133. conVar.Email = 'test@gmail.com';
  134. conVar.Other_Email__c = 'testother@gmail.com';
  135. INSERT conVar;
  136.  
  137. Case casVar = new Case();
  138. casVar.Origin ='Email';
  139. casVar.Status = 'New';
  140. // casVar.ContactEmail = 'test@gmail.com';
  141. casVar.SuppliedEmail = 'testother@gmail.com';
  142. INSERT casVar;
  143.  
  144. Campaign camVar = new Campaign();
  145. camVar.Name ='test';
  146. INSERT camVar;
  147.  
  148. CampaignMember newMemberVar = new CampaignMember();
  149. newMemberVar.CampaignId = camVar.Id;
  150. newMemberVar.ContactId = conVar.Id;
  151. // newMember.Email = 'test@gmail.com';
  152. INSERT newMemberVar;
  153.  
  154. Lead leadVar = new Lead();
  155. leadVar.LastName = 'testsds';
  156. leadVar.Status = 'New';
  157. leadVar.Company = 'test';
  158. leadVar.Email = 'test@gmail.com';
  159. INSERT leadVar;
  160.  
  161. Opportunity oppVar = new Opportunity();
  162. oppVar.Name = 'testsds';
  163. oppVar.AccountId = accVar.Id;
  164. oppVar.CloseDate = date.today();
  165. oppVar.StageName = 'Proposal';
  166. INSERT oppVar;
  167.  
  168. Quote quoteVar = new Quote();
  169. quoteVar.Name = 'testsds';
  170. // quoteVar.Account = accVar.Id;
  171. quoteVar.OpportunityId = oppVar.Id;
  172.  
  173. List<SObjectType> sObjectsToUpdate = new List<SObjectType>{ Account.SObjectType,
  174. Contact.SObjectType,
  175. Case.SObjectType,
  176. CampaignMember.SObjectType,
  177. Lead.SObjectType,
  178. Opportunity.SObjectType,
  179. Quote.SObjectType };
  180.  
  181. for(SObjectType sObjectType : sObjectsToUpdate) {
  182.  
  183. //Describe sObject
  184. DescribeSObjectResult sObjectDescribe = sObjectType.getDescribe();
  185.  
  186. String objectTypeName = sObjectDescribe.getName();
  187.  
  188. //Skip objects we cannot query or update
  189. if(!sObjectDescribe.isQueryable() || !sObjectDescribe.isUpdateable()) continue;
  190.  
  191. for(SObjectField sObjectField: sObjectDescribe.fields.getMap().values()) {
  192.  
  193. DescribeFieldResult thisField = sObjectField.getDescribe();
  194.  
  195. //Skip all non email fields
  196. if(thisField.getType() != Schema.DisplayType.EMAIL || !thisField.isFilterable() || !thisField.isUpdateable()) continue;
  197.  
  198. if(sObjectEmailFieldMap.containsKey(objectTypeName)) {
  199. sObjectEmailFieldMap.get(objectTypeName).add(thisField.getName());
  200. }
  201. else {
  202. sObjectEmailFieldMap.put(objectTypeName, new List <String> {thisField.getName()});
  203. }
  204. }
  205. }
  206.  
  207. Test.startTest();
  208.  
  209. PrepareSandboxPostCopy_Batch obj = new PrepareSandboxPostCopy_Batch(sObjectEmailFieldMap);
  210. PrepareSandboxPostCopy_Batch.executeBatch();
  211. system.assertEquals(true, PrepareSandboxPostCopy_Batch.isSandbox());
  212.  
  213. Test.stopTest();
  214.  
  215. }
  216.  
  217. static Testmethod void testBukifySandboxPostCopyScript() {
  218.  
  219. sObjectEmailFieldMap = New Map <String, List <String>>();
  220.  
  221. List<Account> accListVar = new List<Account>();
  222. List<Contact> conListVar = new List<Contact>();
  223. List<Case> casListVar = new List<Case>();
  224. List<Campaign> camListVar = new List<Campaign>();
  225. List<CampaignMember> newMemberListVar = new List<CampaignMember>();
  226. List<Lead> leadListVar = new List<Lead>();
  227. List<Opportunity> oppListVar = new List<Opportunity>();
  228. List<Quote> quoteListVar = new List<Quote>();
  229. Integer i;
  230.  
  231. for(i=0; i<180; i++){
  232. Account accVar = new Account();
  233. accVar.Name ='AccountTest'+i;
  234. accListVar.add(accVar);
  235. }
  236. INSERT accListVar;
  237.  
  238. for(Account accLoopVar : accListVar){
  239. Contact conVar = new Contact();
  240. conVar.LastName ='ContactTest';
  241. conVar.AccountId =accLoopVar.Id;
  242. conVar.Email = 'test'+accLoopVar.Name+'@gmail.com';
  243. conVar.Other_Email__c = 'testother'+accLoopVar.Name+'@gmail.com';
  244. system.debug('hello'+conVar.Email);
  245. conListVar.add(conVar);
  246. }
  247. INSERT conListVar;
  248.  
  249. for(i=0; i<180; i++){
  250. Case casVar = new Case();
  251. casVar.Origin ='Email';
  252. casVar.Status = 'New';
  253. // casVar.ContactEmail = 'test'+i'@gmail.com';
  254. casVar.SuppliedEmail = 'testother'+i+'@gmail.com';
  255. casListVar.add(casVar);
  256. }
  257. INSERT casListVar;
  258.  
  259. for(i=0; i<180; i++){
  260. Campaign camVar = new Campaign();
  261. camVar.Name ='test'+i;
  262. camListVar.add(camVar);
  263. }
  264. INSERT camListVar;
  265.  
  266. for(Contact conLoopVar : conListVar){
  267. CampaignMember newMemberVar = new CampaignMember();
  268. newMemberVar.CampaignId = camListVar[0].Id;
  269. newMemberVar.ContactId = conLoopVar.Id;
  270. // newMember.Email = 'test@gmail.com';
  271. newMemberListVar.add(newMemberVar);
  272. }
  273. INSERT newMemberListVar;
  274.  
  275. for(i=0; i<180; i++){
  276. Lead leadVar = new Lead();
  277. leadVar.LastName = 'testsds'+i;
  278. leadVar.Status = 'New';
  279. leadVar.Company = 'test'+i;
  280. leadVar.Email = 'test'+i+'@gmail.com';
  281. leadListVar.add(leadVar);
  282. }
  283. INSERT leadListVar;
  284.  
  285. for(Account accLoopVar : accListVar){
  286. Opportunity oppVar = new Opportunity();
  287. oppVar.Name = 'testsds'+accLoopVar.Name;
  288. oppVar.AccountId = accLoopVar.Id;
  289. oppVar.CloseDate = date.today();
  290. oppVar.StageName = 'Proposal';
  291. oppListVar.add(oppVar);
  292. }
  293. INSERT oppListVar;
  294.  
  295. for(Opportunity oppLoopVar : oppListVar){
  296. Quote quoteVar = new Quote();
  297. quoteVar.Name = 'testsds';
  298. // quoteVar.Account = accVar.Id;
  299. quoteVar.OpportunityId = oppLoopVar.Id;
  300. quoteListVar.add(quoteVar);
  301. }
  302. INSERT quoteListVar;
  303.  
  304. List<SObjectType> sObjectsToUpdate = new List<SObjectType>{ Account.SObjectType,
  305. Contact.SObjectType,
  306. Case.SObjectType,
  307. CampaignMember.SObjectType,
  308. Lead.SObjectType,
  309. Opportunity.SObjectType,
  310. Quote.SObjectType };
  311.  
  312. for(SObjectType sObjectType : sObjectsToUpdate) {
  313.  
  314. //Describe sObject
  315. DescribeSObjectResult sObjectDescribe = sObjectType.getDescribe();
  316.  
  317. String objectTypeName = sObjectDescribe.getName();
  318.  
  319. //Skip objects we cannot query or update
  320. if(!sObjectDescribe.isQueryable() || !sObjectDescribe.isUpdateable()) continue;
  321.  
  322. for(SObjectField sObjectField: sObjectDescribe.fields.getMap().values()) {
  323.  
  324. DescribeFieldResult thisField = sObjectField.getDescribe();
  325.  
  326. //Skip all non email fields
  327. if(thisField.getType() != Schema.DisplayType.EMAIL || !thisField.isFilterable() || !thisField.isUpdateable()) continue;
  328.  
  329. if(sObjectEmailFieldMap.containsKey(objectTypeName)) {
  330. sObjectEmailFieldMap.get(objectTypeName).add(thisField.getName());
  331. }
  332. else {
  333. sObjectEmailFieldMap.put(objectTypeName, new List <String> {thisField.getName()});
  334. }
  335. }
  336. }
  337.  
  338. Test.startTest();
  339.  
  340. PrepareSandboxPostCopy_Batch obj = new PrepareSandboxPostCopy_Batch(sObjectEmailFieldMap);
  341. PrepareSandboxPostCopy_Batch.executeBatch();
  342. system.assertEquals(true, PrepareSandboxPostCopy_Batch.isSandbox());
  343.  
  344. Test.stopTest();
  345. }
  346.  
  347.  
  348. }
Add Comment
Please, Sign In to add comment