- Type cannot be the controlling field for a dependent picklist.
- On an Event list view (/007), even when specifying record type, the Type field cannot be edited.
- Salesforce requires you to select a default value for this picklist, as well as a default value for inbound emails... yet when I bcc my Email-To-Salesforce address, the resulting tasks have no Type value.
- Work in a sandbox (duh)
- Create a picklist field on Activity (ActivityType__c).
- Disable all Activity workflow rules, Chatter feeds, triggers, etc.
- Using DataLoader, copy values from Type to ActivityType__c.
- Using Field Level Security, hide Type from all profiles. It's just not necessary.
- Edit/reactivate all your workflow, feeds, triggers, etc.
- Use/adapt the code below.
- Test thoroughly and deploy to production.
trigger TaskTrigger on Task (before insert, before update) { ActivityHelper.UpdateTaskType(Trigger. new ); } |
trigger EventTrigger on Event (before insert, before update) { ActivityHelper.UpdateEventType(Trigger. new ); } |
// Written by David Schach, X-Squared On Demand public with sharing class ActivityHelper { public static void UpdateEventType(Event[] events){ for (Event e : events){ if (e.ActivityType__c == '' || e.ActivityType__c == null ){ if (e.Subject.contains( 'Email' )) e.ActivityType__c = 'Email' ; else if (e.Subject.contains( 'Call' )) e.ActivityType__c = 'Call' ; else if (e.Subject.contains( 'Meet' ) || e.Subject.contains( 'Webinar' )) e.ActivityType__c = 'Meeting' ; } } } public static void UpdateTaskType(Task[] tasks){ for (Task t : tasks){ if (t.ActivityType__c == '' || t.ActivityType__c == null ){ if (t.Subject.contains( 'Email ' ) || t.Subject.contains( 'Email:' )) t.ActivityType__c = 'Email' ; else if (t.Subject.contains( 'Call' )) t.ActivityType__c = 'Call' ; else if (t.Subject.contains( 'Meet' ) || t.Subject.contains( 'Webinar' )) t.ActivityType__c = 'Meeting' ; } } } private static Event newTestEvent(string subject){ Event e = new Event(); e.Subject = subject; e.startdatetime = datetime.now(); e.DurationInMinutes = 60 ; e.ActivityType__c = '' ; // To account for default value. return e; } private static Task newTestTask(string subject){ Task t = new Task(); t.Subject = subject; t.Priority = 'Medium' ; t.Status = 'New' ; t.ActivityType__c = '' ; // To account for default value. return t; } static TestMethod void TestEvents(){ test.starttest(); List<Event> ourevents = new List<Event>(); ourevents.add(newTestEvent( 'e1' )); ourevents.add(newTestEvent( 'Email: Thank you' )); ourevents.add(newTestEvent( 'Call: (212) 555-1212' )); ourevents.add(newTestEvent( 'Webinar tomorrow' )); ourevents.add(newTestEvent( 'Meet Jack' )); ourevents.add(newTestEvent( 'Sales time' )); insert ourevents; update ourevents; for (Event e : [SELECT id, Type from Event WHERE id in :ourEvents]){ system.debug( 'EVENT TYPE: ' + e.ActivityType__c); } test.stoptest(); } static TestMethod void TestTasks(){ test.starttest(); List<Task> ourTasks = new List<Task>(); ourTasks.add(newTestTask( 'e1' )); ourTasks.add(newTestTask( 'Email: Thank you' )); ourTasks.add(newTestTask( 'Call: (212) 555-1212' )); ourTasks.add(newTestTask( 'Webinar tomorrow' )); ourTasks.add(newTestTask( 'Meet Jack' )); ourTasks.add(newTestTask( 'Sales time' )); insert ourTasks; update ourTasks; for (Task t : [SELECT id, Type from Task WHERE id in :ourTasks]){ system.debug( 'TASK TYPE: ' + t.ActivityType__c); } test.stoptest(); } static testMethod void IndividualActivityTest() { Event e = newTestEvent( 'e1' ); Task t = newTestTask( 't1' ); test.starttest(); insert e; insert t; e.subject = 'Meeting' ; update e; e.subject = 'Call: Geoff Peterson' ; update e; e.subject = 'Email: Here we go' ; update e; e.subject = 'Webinar' ; update e; t.subject = 'Meeting' ; update t; t.subject = 'Call' ; update t; t.subject = 'Email' ; update t; t.subject = 'Webinar' ; update t; test.stoptest(); } } |
Share Your Thoughts