Guest User

Untitled

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