CRM-21406 - Standalone export form
[civicrm-core.git] / CRM / Contact / Task.php
1 <?php
2 /*
3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.7 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2017 |
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-2017
32 */
33
34 /**
35 * Class to represent the actions that can be performed on a group of contacts used by the search forms.
36 */
37 class CRM_Contact_Task {
38 const
39 GROUP_CONTACTS = 1,
40 REMOVE_CONTACTS = 2,
41 TAG_CONTACTS = 3,
42 REMOVE_TAGS = 4,
43 EXPORT_CONTACTS = 5,
44 EMAIL_CONTACTS = 6,
45 SMS_CONTACTS = 7,
46 DELETE_CONTACTS = 8,
47 HOUSEHOLD_CONTACTS = 9,
48 ORGANIZATION_CONTACTS = 10,
49 RECORD_CONTACTS = 11,
50 MAP_CONTACTS = 12,
51 SAVE_SEARCH = 13,
52 SAVE_SEARCH_UPDATE = 14,
53 PRINT_CONTACTS = 15,
54 LABEL_CONTACTS = 16,
55 BATCH_UPDATE = 17,
56 ADD_EVENT = 18,
57 PRINT_FOR_CONTACTS = 19,
58 CREATE_MAILING = 20,
59 MERGE_CONTACTS = 21,
60 EMAIL_UNHOLD = 22,
61 RESTORE = 23,
62 DELETE_PERMANENTLY = 24,
63 COMMUNICATION_PREFS = 25,
64 INDIVIDUAL_CONTACTS = 26;
65
66 /**
67 * The task array
68 *
69 * @var array
70 */
71 static $_tasks = NULL;
72
73 /**
74 * The optional task array
75 *
76 * @var array
77 */
78 static $_optionalTasks = NULL;
79
80 public static function tasks() {
81 self::initTasks();
82 return self::$_tasks;
83 }
84
85 public static function initTasks() {
86 if (!self::$_tasks) {
87 self::$_tasks = array(
88 self::GROUP_CONTACTS => array(
89 'title' => ts('Group - add contacts'),
90 'class' => 'CRM_Contact_Form_Task_AddToGroup',
91 'url' => 'civicrm/task/add-to-group',
92 ),
93 self::REMOVE_CONTACTS => array(
94 'title' => ts('Group - remove contacts'),
95 'class' => 'CRM_Contact_Form_Task_RemoveFromGroup',
96 'url' => 'civicrm/task/remove-from-group',
97 ),
98 self::TAG_CONTACTS => array(
99 'title' => ts('Tag - add to contacts'),
100 'class' => 'CRM_Contact_Form_Task_AddToTag',
101 'url' => 'civicrm/task/add-to-tag',
102 ),
103 self::REMOVE_TAGS => array(
104 'title' => ts('Tag - remove from contacts'),
105 'class' => 'CRM_Contact_Form_Task_RemoveFromTag',
106 'url' => 'civicrm/task/remove-from-tag',
107 ),
108 self::EXPORT_CONTACTS => array(
109 'title' => ts('Export contacts'),
110 'class' => array(
111 'CRM_Export_Form_Select',
112 'CRM_Export_Form_Map',
113 ),
114 'result' => FALSE,
115 ),
116 self::EMAIL_CONTACTS => array(
117 'title' => ts('Email - send now (to %1 or less)', array(1 => Civi::settings()->get('simple_mail_limit'))),
118 'class' => 'CRM_Contact_Form_Task_Email',
119 'result' => TRUE,
120 'url' => 'civicrm/task/send-email',
121 ),
122 self::DELETE_CONTACTS => array(
123 'title' => ts('Delete contacts'),
124 'class' => 'CRM_Contact_Form_Task_Delete',
125 'result' => FALSE,
126 'url' => 'civicrm/task/delete-contact',
127 ),
128 self::RECORD_CONTACTS => array(
129 'title' => ts('Add activity'),
130 'class' => 'CRM_Activity_Form_Activity',
131 ),
132 self::SAVE_SEARCH => array(
133 'title' => ts('Group - create smart group'),
134 'class' => 'CRM_Contact_Form_Task_SaveSearch',
135 'result' => TRUE,
136 ),
137 self::SAVE_SEARCH_UPDATE => array(
138 'title' => ts('Group - update smart group'),
139 'class' => 'CRM_Contact_Form_Task_SaveSearch_Update',
140 'result' => TRUE,
141 ),
142 self::PRINT_CONTACTS => array(
143 'title' => ts('Print selected rows'),
144 'class' => 'CRM_Contact_Form_Task_Print',
145 'result' => FALSE,
146 ),
147 self::LABEL_CONTACTS => array(
148 'title' => ts('Mailing labels - print'),
149 'class' => 'CRM_Contact_Form_Task_Label',
150 'result' => TRUE,
151 'url' => 'civicrm/task/make-mailing-label',
152 ),
153 self::BATCH_UPDATE => array(
154 'title' => ts('Update multiple contacts'),
155 'class' => array(
156 'CRM_Contact_Form_Task_PickProfile',
157 'CRM_Contact_Form_Task_Batch',
158 ),
159 'result' => TRUE,
160 'url' => 'civicrm/task/pick-profile',
161 ),
162 self::PRINT_FOR_CONTACTS => array(
163 'title' => ts('Print/merge document'),
164 'class' => 'CRM_Contact_Form_Task_PDF',
165 'result' => TRUE,
166 'url' => 'civicrm/task/print-document',
167 ),
168 self::EMAIL_UNHOLD => array(
169 'title' => ts('Email - unhold addresses'),
170 'class' => 'CRM_Contact_Form_Task_Unhold',
171 'url' => 'civicrm/task/unhold-email',
172 ),
173 self::COMMUNICATION_PREFS => array(
174 'title' => ts('Communication preferences - alter'),
175 'class' => 'CRM_Contact_Form_Task_AlterPreferences',
176 'url' => 'civicrm/task/alter-contact-preference',
177 ),
178 self::RESTORE => array(
179 'title' => ts('Restore contacts from trash'),
180 'class' => 'CRM_Contact_Form_Task_Delete',
181 'result' => FALSE,
182 ),
183 self::DELETE_PERMANENTLY => array(
184 'title' => ts('Delete permanently'),
185 'class' => 'CRM_Contact_Form_Task_Delete',
186 'result' => FALSE,
187 ),
188 );
189
190 //CRM-16329, if SMS provider is configured show sms action.
191 $providersCount = CRM_SMS_BAO_Provider::activeProviderCount();
192 if ($providersCount) {
193 self::$_tasks[self::SMS_CONTACTS] = array(
194 'title' => ts('SMS - schedule/send'),
195 'class' => 'CRM_Contact_Form_Task_SMS',
196 'result' => TRUE,
197 );
198 }
199
200 if (CRM_Contact_BAO_ContactType::isActive('Individual')) {
201 $label = CRM_Contact_BAO_ContactType::getLabel('individual');
202 self::$_tasks[self::INDIVIDUAL_CONTACTS] = array(
203 'title' => ts('Add relationship - to %1',
204 array(1 => $label)
205 ),
206 'class' => 'CRM_Contact_Form_Task_AddToIndividual',
207 );
208 }
209
210 if (CRM_Contact_BAO_ContactType::isActive('Household')) {
211 $label = CRM_Contact_BAO_ContactType::getLabel('household');
212 self::$_tasks[self::HOUSEHOLD_CONTACTS] = array(
213 'title' => ts('Add relationship - to %1',
214 array(1 => $label)
215 ),
216 'class' => 'CRM_Contact_Form_Task_AddToHousehold',
217 );
218 }
219
220 if (CRM_Contact_BAO_ContactType::isActive('Organization')) {
221 $label = CRM_Contact_BAO_ContactType::getLabel('organization');
222 self::$_tasks[self::ORGANIZATION_CONTACTS] = array(
223 'title' => ts('Add relationship - to %1',
224 array(1 => $label)
225 ),
226 'class' => 'CRM_Contact_Form_Task_AddToOrganization',
227 );
228 }
229
230 if (CRM_Core_Permission::check('merge duplicate contacts')) {
231 self::$_tasks[self::MERGE_CONTACTS] = array(
232 'title' => ts('Merge contacts'),
233 'class' => 'CRM_Contact_Form_Task_Merge',
234 'result' => TRUE,
235 );
236 }
237
238 //CRM-4418, check for delete
239 if (!CRM_Core_Permission::check('delete contacts')) {
240 unset(self::$_tasks[self::DELETE_CONTACTS]);
241 }
242
243 //show map action only if map provider and geoprovider are set (Google doesn't need geoprovider)
244 // should fix this to be more flexible as providers are added ??
245 $config = CRM_Core_Config::singleton();
246
247 if ($config->mapProvider &&
248 ($config->mapProvider == 'Google' ||
249 ($config->mapProvider == 'OpenStreetMaps' ||
250 $config->geoProvider == 'Google'
251 )
252 )
253 ) {
254 self::$_tasks[self::MAP_CONTACTS] = array(
255 'title' => ts('Map contacts'),
256 'class' => 'CRM_Contact_Form_Task_Map',
257 'result' => FALSE,
258 );
259 }
260
261 if (CRM_Core_Permission::access('CiviEvent')) {
262 self::$_tasks[self::ADD_EVENT] = array(
263 'title' => ts('Register participants for event'),
264 'class' => 'CRM_Event_Form_Participant',
265 );
266 }
267
268 if (CRM_Core_Permission::access('CiviMail')
269 || (CRM_Mailing_Info::workflowEnabled() && CRM_Core_Permission::check('create mailings'))
270 ) {
271 self::$_tasks[self::CREATE_MAILING] = array(
272 'title' => ts('Email - schedule/send via CiviMail'),
273 'class' => 'CRM_Mailing_Form_Task_AdhocMailing',
274 'result' => FALSE,
275 );
276 }
277
278 self::$_tasks += CRM_Core_Component::taskList();
279
280 CRM_Utils_Hook::searchTasks('contact', self::$_tasks);
281
282 }
283 }
284
285 /**
286 * These tasks are the core set of tasks that the user can perform
287 * on a contact / group of contacts
288 *
289 * @return array
290 * the set of tasks for a group of contacts
291 */
292 public static function &taskTitles() {
293 self::initTasks();
294
295 $titles = array();
296 foreach (self::$_tasks as $id => $value) {
297 $titles[$id] = $value['title'];
298 }
299
300 // hack unset update saved search
301 unset($titles[self::SAVE_SEARCH_UPDATE]);
302
303 if (!CRM_Utils_Mail::validOutBoundMail()) {
304 unset($titles[self::EMAIL_CONTACTS]);
305 unset($titles[self::CREATE_MAILING]);
306 }
307
308 // CRM-6806
309 if (!CRM_Core_Permission::check('access deleted contacts') ||
310 !CRM_Core_Permission::check('delete contacts')
311 ) {
312 unset($titles[self::DELETE_PERMANENTLY]);
313 }
314 return $titles;
315 }
316
317 /**
318 * Show tasks selectively based on the permission level
319 * of the user
320 *
321 * @param int $permission
322 * @param bool $deletedContacts
323 * Are these tasks for operating on deleted contacts?.
324 *
325 * @return array
326 * set of tasks that are valid for the user
327 */
328 public static function &permissionedTaskTitles($permission, $deletedContacts = FALSE) {
329 self::initTasks();
330 $tasks = array();
331 if ($deletedContacts) {
332 if (CRM_Core_Permission::check('access deleted contacts')) {
333 $tasks[self::RESTORE] = self::$_tasks[self::RESTORE]['title'];
334 if (CRM_Core_Permission::check('delete contacts')) {
335 $tasks[self::DELETE_PERMANENTLY] = self::$_tasks[self::DELETE_PERMANENTLY]['title'];
336 }
337 }
338 }
339 elseif ($permission == CRM_Core_Permission::EDIT) {
340 $tasks = self::taskTitles();
341 }
342 else {
343 $tasks = array(
344 self::EXPORT_CONTACTS => self::$_tasks[self::EXPORT_CONTACTS]['title'],
345 self::EMAIL_CONTACTS => self::$_tasks[self::EMAIL_CONTACTS]['title'],
346 self::LABEL_CONTACTS => self::$_tasks[self::LABEL_CONTACTS]['title'],
347 );
348
349 if (isset(self::$_tasks[self::MAP_CONTACTS]) &&
350 !empty(self::$_tasks[self::MAP_CONTACTS]['title'])
351 ) {
352 $tasks[self::MAP_CONTACTS] = self::$_tasks[self::MAP_CONTACTS]['title'];
353 }
354
355 if (isset(self::$_tasks[self::CREATE_MAILING]) &&
356 !empty(self::$_tasks[self::CREATE_MAILING]['title'])
357 ) {
358 $tasks[self::CREATE_MAILING] = self::$_tasks[self::CREATE_MAILING]['title'];
359 }
360 }
361 return $tasks;
362 }
363
364 /**
365 * These tasks get added based on the context the user is in.
366 *
367 * @return array
368 * the set of optional tasks for a group of contacts
369 */
370 public static function &optionalTaskTitle() {
371 $tasks = array(
372 self::SAVE_SEARCH_UPDATE => self::$_tasks[self::SAVE_SEARCH_UPDATE]['title'],
373 );
374 return $tasks;
375 }
376
377 /**
378 * @param $value
379 *
380 * @return array
381 */
382 public static function getTask($value) {
383 self::initTasks();
384
385 if (!CRM_Utils_Array::value($value, self::$_tasks)) {
386 // make it the print task by default
387 $value = self::PRINT_CONTACTS;
388 }
389 return array(
390 CRM_Utils_Array::value('class', self::$_tasks[$value]),
391 CRM_Utils_Array::value('result', self::$_tasks[$value]),
392 );
393 }
394
395 /**
396 * Function to return the task information on basis of provided task's form name
397 *
398 * @param string $className
399 *
400 * @return array
401 */
402 public static function getTaskAndTitleByClass($className) {
403 self::initTasks();
404
405 foreach (self::$_tasks as $task => $value) {
406 if ((!empty($value['url']) || $task == self::EXPORT_CONTACTS) && (
407 (is_array($value['class']) && in_array($className, $value['class'])) ||
408 ($value['class'] == $className)
409 )
410 ) {
411 return array(
412 $task,
413 CRM_Utils_Array::value('title', $value),
414 );
415 }
416 }
417 }
418
419 }