Merge pull request #4815 from rohankatkar/Webtests
[civicrm-core.git] / CRM / Contact / Task.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.6 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2014 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
9 | |
10 | CiviCRM is free software; you can copy, modify, and distribute it |
11 | under the terms of the GNU Affero General Public License |
12 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
13 | |
14 | CiviCRM is distributed in the hope that it will be useful, but |
15 | WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
17 | See the GNU Affero General Public License for more details. |
18 | |
19 | You should have received a copy of the GNU Affero General Public |
20 | License and the CiviCRM Licensing Exception along |
21 | with this program; if not, contact CiviCRM LLC |
22 | at info[AT]civicrm[DOT]org. If you have questions about the |
23 | GNU Affero General Public License or the licensing of CiviCRM, |
24 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
25 +--------------------------------------------------------------------+
26 */
27
28 /**
29 *
30 * @package CRM
31 * @copyright CiviCRM LLC (c) 2004-2014
32 * $Id$
33 *
34 */
35
36 /**
37 * class to represent the actions that can be performed on a group of contacts
38 * used by the search forms
39 *
40 */
41 class CRM_Contact_Task {
42 const
43 GROUP_CONTACTS = 1,
44 REMOVE_CONTACTS = 2,
45 TAG_CONTACTS = 3,
46 REMOVE_TAGS = 4,
47 EXPORT_CONTACTS = 5,
48 EMAIL_CONTACTS = 6,
49 SMS_CONTACTS = 7,
50 DELETE_CONTACTS = 8,
51 HOUSEHOLD_CONTACTS = 9,
52 ORGANIZATION_CONTACTS = 10,
53 RECORD_CONTACTS = 11,
54 MAP_CONTACTS = 12,
55 SAVE_SEARCH = 13,
56 SAVE_SEARCH_UPDATE = 14,
57 PRINT_CONTACTS = 15,
58 LABEL_CONTACTS = 16,
59 BATCH_UPDATE = 17,
60 ADD_EVENT = 18,
61 PRINT_FOR_CONTACTS = 19,
62 CREATE_MAILING = 20,
63 MERGE_CONTACTS = 21,
64 EMAIL_UNHOLD = 22,
65 RESTORE = 23,
66 DELETE_PERMANENTLY = 24,
67 COMMUNICATION_PREFS = 25;
68
69 /**
70 * The task array
71 *
72 * @var array
73 * @static
74 */
75 static $_tasks = NULL;
76
77 /**
78 * The optional task array
79 *
80 * @var array
81 * @static
82 */
83 static $_optionalTasks = NULL;
84
85 public static function initTasks() {
86 if (!self::$_tasks) {
87 self::$_tasks = array(
88 self::GROUP_CONTACTS => array(
89 'title' => ts('Add Contacts to Group'),
90 'class' => 'CRM_Contact_Form_Task_AddToGroup',
91 ),
92 self::REMOVE_CONTACTS => array(
93 'title' => ts('Remove Contacts from Group'),
94 'class' => 'CRM_Contact_Form_Task_RemoveFromGroup',
95 ),
96 self::TAG_CONTACTS => array(
97 'title' => ts('Tag Contacts (assign tags)'),
98 'class' => 'CRM_Contact_Form_Task_AddToTag',
99 ),
100 self::REMOVE_TAGS => array(
101 'title' => ts('Untag Contacts (remove tags)'),
102 'class' => 'CRM_Contact_Form_Task_RemoveFromTag',
103 ),
104 self::EXPORT_CONTACTS => array(
105 'title' => ts('Export Contacts'),
106 'class' => array(
107 'CRM_Export_Form_Select',
108 'CRM_Export_Form_Map',
109 ),
110 'result' => FALSE,
111 ),
112 self::EMAIL_CONTACTS => array(
113 'title' => ts('Send Email to Contacts'),
114 'class' => 'CRM_Contact_Form_Task_Email',
115 'result' => TRUE,
116 ),
117 self::SMS_CONTACTS => array(
118 'title' => ts('Send SMS to Contacts'),
119 'class' => 'CRM_Contact_Form_Task_SMS',
120 'result' => TRUE,
121 ),
122 self::DELETE_CONTACTS => array(
123 'title' => ts('Delete Contacts'),
124 'class' => 'CRM_Contact_Form_Task_Delete',
125 'result' => FALSE,
126 ),
127 self::RECORD_CONTACTS => array(
128 'title' => ts('Record Activity for Contacts'),
129 'class' => 'CRM_Activity_Form_Activity',
130 ),
131 self::SAVE_SEARCH => array(
132 'title' => ts('New Smart Group'),
133 'class' => 'CRM_Contact_Form_Task_SaveSearch',
134 'result' => TRUE,
135 ),
136 self::SAVE_SEARCH_UPDATE => array(
137 'title' => ts('Update Smart Group'),
138 'class' => 'CRM_Contact_Form_Task_SaveSearch_Update',
139 'result' => TRUE,
140 ),
141 self::PRINT_CONTACTS => array(
142 'title' => ts('Print Selected Rows'),
143 'class' => 'CRM_Contact_Form_Task_Print',
144 'result' => FALSE,
145 ),
146 self::LABEL_CONTACTS => array(
147 'title' => ts('Mailing Labels'),
148 'class' => 'CRM_Contact_Form_Task_Label',
149 'result' => TRUE,
150 ),
151 self::BATCH_UPDATE => array(
152 'title' => ts('Batch Update via Profile'),
153 'class' => array(
154 'CRM_Contact_Form_Task_PickProfile',
155 'CRM_Contact_Form_Task_Batch',
156 ),
157 'result' => TRUE,
158 ),
159 self::PRINT_FOR_CONTACTS => array(
160 'title' => ts('Print PDF Letter for Contacts'),
161 'class' => 'CRM_Contact_Form_Task_PDF',
162 'result' => TRUE,
163 ),
164 self::EMAIL_UNHOLD => array(
165 'title' => ts('Unhold Emails'),
166 'class' => 'CRM_Contact_Form_Task_Unhold',
167 ),
168 self::COMMUNICATION_PREFS => array(
169 'title' => ts('Alter Contact Communication Preferences'),
170 'class' => 'CRM_Contact_Form_Task_AlterPreferences',
171 ),
172 self::RESTORE => array(
173 'title' => ts('Restore Contacts'),
174 'class' => 'CRM_Contact_Form_Task_Delete',
175 'result' => FALSE,
176 ),
177 self::DELETE_PERMANENTLY => array(
178 'title' => ts('Delete Permanently'),
179 'class' => 'CRM_Contact_Form_Task_Delete',
180 'result' => FALSE,
181 ),
182 );
183
184 if (CRM_Contact_BAO_ContactType::isActive('Household')) {
185 $label = CRM_Contact_BAO_ContactType::getLabel('Household');
186 self::$_tasks[self::HOUSEHOLD_CONTACTS] = array(
187 'title' => ts('Add Contacts to %1',
188 array(1 => $label)
189 ),
190 'class' => 'CRM_Contact_Form_Task_AddToHousehold',
191 );
192 }
193
194 if (CRM_Contact_BAO_ContactType::isActive('Organization')) {
195 $label = CRM_Contact_BAO_ContactType::getLabel('Organization');
196 self::$_tasks[self::ORGANIZATION_CONTACTS] = array(
197 'title' => ts('Add Contacts to %1',
198 array(1 => $label)
199 ),
200 'class' => 'CRM_Contact_Form_Task_AddToOrganization',
201 );
202 }
203
204 if (CRM_Core_Permission::check('merge duplicate contacts')) {
205 self::$_tasks[self::MERGE_CONTACTS] = array(
206 'title' => ts('Merge Contacts'),
207 'class' => 'CRM_Contact_Form_Task_Merge',
208 'result' => TRUE,
209 );
210 }
211
212 //CRM-4418, check for delete
213 if (!CRM_Core_Permission::check('delete contacts')) {
214 unset(self::$_tasks[self::DELETE_CONTACTS]);
215 }
216
217 //show map action only if map provider and geoprovider are set (Google doesn't need geoprovider)
218 // should fix this to be more flexible as providers are added ??
219 $config = CRM_Core_Config::singleton();
220
221 if ($config->mapProvider &&
222 ($config->mapProvider == 'Google' ||
223 ($config->mapProvider == 'OpenStreetMaps' ||
224 $config->geoProvider == 'Google'
225 )
226 )
227 ) {
228 self::$_tasks[self::MAP_CONTACTS] = array(
229 'title' => ts('Map Contacts'),
230 'class' => 'CRM_Contact_Form_Task_Map',
231 'result' => FALSE,
232 );
233 }
234
235 if (CRM_Core_Permission::access('CiviEvent')) {
236 self::$_tasks[self::ADD_EVENT] = array(
237 'title' => ts('Add Contacts to Event'),
238 'class' => 'CRM_Event_Form_Participant',
239 );
240 }
241
242 if (CRM_Core_Permission::access('CiviMail')) {
243 self::$_tasks[self::CREATE_MAILING] = array(
244 'title' => ts('Schedule/Send a Mass Mailing'),
245 'class' => array(
246 'CRM_Mailing_Form_Group',
247 'CRM_Mailing_Form_Settings',
248 'CRM_Mailing_Form_Upload',
249 'CRM_Mailing_Form_Test',
250 'CRM_Mailing_Form_Schedule',
251 ),
252 'result' => FALSE,
253 );
254 }
255 elseif (CRM_Mailing_Info::workflowEnabled() &&
256 CRM_Core_Permission::check('create mailings')
257 ) {
258 self::$_tasks[self::CREATE_MAILING] = array(
259 'title' => ts('Create a Mass Mailing'),
260 'class' => array(
261 'CRM_Mailing_Form_Group',
262 'CRM_Mailing_Form_Settings',
263 'CRM_Mailing_Form_Upload',
264 'CRM_Mailing_Form_Test',
265 ),
266 'result' => FALSE,
267 );
268 }
269
270 self::$_tasks += CRM_Core_Component::taskList();
271
272 CRM_Utils_Hook::searchTasks('contact', self::$_tasks);
273
274 asort(self::$_tasks);
275 }
276 }
277
278 /**
279 * These tasks are the core set of tasks that the user can perform
280 * on a contact / group of contacts
281 *
282 * @return array the set of tasks for a group of contacts
283 * @static
284 */
285 public static function &taskTitles() {
286 self::initTasks();
287
288 $titles = array();
289 foreach (self::$_tasks as $id => $value) {
290 $titles[$id] = $value['title'];
291 }
292
293 // hack unset update saved search
294 unset($titles[self::SAVE_SEARCH_UPDATE]);
295
296 if (!CRM_Utils_Mail::validOutBoundMail()) {
297 unset($titles[self::EMAIL_CONTACTS]);
298 unset($titles[self::CREATE_MAILING]);
299 }
300
301 // CRM-6806
302 if (!CRM_Core_Permission::check('access deleted contacts') ||
303 !CRM_Core_Permission::check('delete contacts')
304 ) {
305 unset($titles[self::DELETE_PERMANENTLY]);
306 }
307 asort($titles);
308 return $titles;
309 }
310
311 /**
312 * Show tasks selectively based on the permission level
313 * of the user
314 *
315 * @param int $permission
316 * @param bool $deletedContacts are these tasks for operating on deleted contacts?
317 *
318 * @return array set of tasks that are valid for the user
319 */
320 public static function &permissionedTaskTitles($permission, $deletedContacts = FALSE) {
321 self::initTasks();
322 $tasks = array();
323 if ($deletedContacts) {
324 if (CRM_Core_Permission::check('access deleted contacts')) {
325 $tasks[self::RESTORE] = self::$_tasks[self::RESTORE]['title'];
326 if (CRM_Core_Permission::check('delete contacts')) {
327 $tasks[self::DELETE_PERMANENTLY] = self::$_tasks[self::DELETE_PERMANENTLY]['title'];
328 }
329 }
330 }
331 elseif ($permission == CRM_Core_Permission::EDIT) {
332 $tasks = self::taskTitles();
333 }
334 else {
335 $tasks = array(
336 self::EXPORT_CONTACTS => self::$_tasks[self::EXPORT_CONTACTS]['title'],
337 self::EMAIL_CONTACTS => self::$_tasks[self::EMAIL_CONTACTS]['title'],
338 self::LABEL_CONTACTS => self::$_tasks[self::LABEL_CONTACTS]['title'],
339 );
340
341 if (isset(self::$_tasks[self::MAP_CONTACTS]) &&
342 !empty(self::$_tasks[self::MAP_CONTACTS]['title'])
343 ) {
344 $tasks[self::MAP_CONTACTS] = self::$_tasks[self::MAP_CONTACTS]['title'];
345 }
346
347 if (isset(self::$_tasks[self::CREATE_MAILING]) &&
348 !empty(self::$_tasks[self::CREATE_MAILING]['title'])
349 ) {
350 $tasks[self::CREATE_MAILING] = self::$_tasks[self::CREATE_MAILING]['title'];
351 }
352 }
353 return $tasks;
354 }
355
356 /**
357 * These tasks get added based on the context the user is in
358 *
359 * @return array the set of optional tasks for a group of contacts
360 * @static
361 */
362 public static function &optionalTaskTitle() {
363 $tasks = array(
364 self::SAVE_SEARCH_UPDATE => self::$_tasks[self::SAVE_SEARCH_UPDATE]['title'],
365 );
366 return $tasks;
367 }
368
369 /**
370 * @param $value
371 *
372 * @return array
373 */
374 public static function getTask($value) {
375 self::initTasks();
376
377 if (!CRM_Utils_Array::value($value, self::$_tasks)) {
378 // make it the print task by default
379 $value = self::PRINT_CONTACTS;
380 }
381 return array(
382 CRM_Utils_Array::value('class', self::$_tasks[$value]),
383 CRM_Utils_Array::value('result', self::$_tasks[$value]),
384 );
385 }
386 }